@@ -1018,10 +1018,15 @@ impl Insn {
10181018 Insn :: Param => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10191019 Insn :: StringCopy { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10201020 Insn :: NewArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1021- // NewHash's operands may be hashed and compared for equalityEffect::from_bits(effect_sets::Any, effect_sets::Allocator), which could have
1022- // side-effects.
1023- // fix newhash which seems to be different than the rest
1024- // Insn::NewHash { elementsEffect::from_bits(effect_sets::Any, effect_sets::Allocator), .. } => Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1021+ Insn :: NewHash { elements, .. } => {
1022+ // Empty is elidable
1023+ if elements. is_empty ( ) {
1024+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
1025+ }
1026+ else {
1027+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
1028+ }
1029+ } ,
10251030 Insn :: ArrayDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10261031 Insn :: HashDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10271032 Insn :: Test { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
@@ -1046,10 +1051,22 @@ impl Insn {
10461051 Insn :: LoadEC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10471052 Insn :: LoadSelf => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10481053 Insn :: LoadField { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1049- // Special case, let's fix this
1050- // Insn::CCall { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1051- // Special case, let's fix this one too
1052- // Insn::CCallWithFrame { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1054+ Insn :: CCall { elidable, .. } => {
1055+ if * elidable {
1056+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
1057+ }
1058+ else {
1059+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
1060+ }
1061+ } ,
1062+ Insn :: CCallWithFrame { elidable, .. } => {
1063+ if * elidable {
1064+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
1065+ }
1066+ else {
1067+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
1068+ }
1069+ } ,
10531070 Insn :: ObjectAllocClass { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10541071 Insn :: NewRangeFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10551072 Insn :: StringGetbyte { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
@@ -1074,7 +1091,6 @@ impl Insn {
10741091 /// collapses to `effects::Allocator.includes(insn_effects.write)`.
10751092 /// Note: These are restrictions on the `write` `EffectSet` only. Even instructions with
10761093 /// `read: effects::Any` could potentially be omitted.
1077- // TODO(Jacob): Replace `has_effects` with `!is_elidable` once `effects_of` is correct.
10781094 // TODO(Jacob): Ensure that `is_elidable` === `!has_effects` for all inputs
10791095 fn is_elidable ( & self ) -> bool {
10801096 let writes_allocator = Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ;
@@ -4175,7 +4191,9 @@ impl Function {
41754191 for block_id in & rpo {
41764192 for insn_id in & self . blocks [ block_id. 0 ] . insns {
41774193 let insn = & self . insns [ insn_id. 0 ] ;
4178- if insn. has_effects ( ) {
4194+ if !insn. is_elidable ( ) {
4195+ // TODO(Jacob): Remove this comment
4196+ // if insn.has_effects() {
41794197 worklist. push_back ( * insn_id) ;
41804198 }
41814199 }
0 commit comments