Skip to content

Commit 6fc4b63

Browse files
committed
Improved get_effects
1 parent 93bb30e commit 6fc4b63

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

zjit/src/hir.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)