@@ -976,10 +976,15 @@ impl Insn {
976976 Insn :: Param => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
977977 Insn :: StringCopy { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
978978 Insn :: NewArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
979- // NewHash's operands may be hashed and compared for equalityEffect::from_bits(effect_sets::Any, effect_sets::Allocator), which could have
980- // side-effects.
981- // fix newhash which seems to be different than the rest
982- // Insn::NewHash { elementsEffect::from_bits(effect_sets::Any, effect_sets::Allocator), .. } => Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
979+ Insn :: NewHash { elements, .. } => {
980+ // Empty is elidable
981+ if elements. is_empty ( ) {
982+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
983+ }
984+ else {
985+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
986+ }
987+ } ,
983988 Insn :: ArrayDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
984989 Insn :: HashDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
985990 Insn :: Test { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
@@ -1004,10 +1009,22 @@ impl Insn {
10041009 Insn :: LoadEC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10051010 Insn :: LoadSelf => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10061011 Insn :: LoadField { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1007- // Special case, let's fix this
1008- // Insn::CCall { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1009- // Special case, let's fix this one too
1010- // Insn::CCallWithFrame { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1012+ Insn :: CCall { elidable, .. } => {
1013+ if * elidable {
1014+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
1015+ }
1016+ else {
1017+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
1018+ }
1019+ } ,
1020+ Insn :: CCallWithFrame { elidable, .. } => {
1021+ if * elidable {
1022+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator )
1023+ }
1024+ else {
1025+ Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any )
1026+ }
1027+ } ,
10111028 Insn :: ObjectAllocClass { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10121029 Insn :: NewRangeFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
10131030 Insn :: StringGetbyte { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
@@ -1032,7 +1049,6 @@ impl Insn {
10321049 /// collapses to `effects::Allocator.includes(insn_effects.write)`.
10331050 /// Note: These are restrictions on the `write` `EffectSet` only. Even instructions with
10341051 /// `read: effects::Any` could potentially be omitted.
1035- // TODO(Jacob): Replace `has_effects` with `!is_elidable` once `effects_of` is correct.
10361052 // TODO(Jacob): Ensure that `is_elidable` === `!has_effects` for all inputs
10371053 fn is_elidable ( & self ) -> bool {
10381054 let writes_allocator = Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ;
@@ -4068,7 +4084,9 @@ impl Function {
40684084 for block_id in & rpo {
40694085 for insn_id in & self . blocks [ block_id. 0 ] . insns {
40704086 let insn = & self . insns [ insn_id. 0 ] ;
4071- if insn. has_effects ( ) {
4087+ if !insn. is_elidable ( ) {
4088+ // TODO(Jacob): Remove this comment
4089+ // if insn.has_effects() {
40724090 worklist. push_back ( * insn_id) ;
40734091 }
40744092 }
0 commit comments