Skip to content

Commit 520600a

Browse files
committed
Improved get_effects
1 parent 7699d9b commit 520600a

1 file changed

Lines changed: 28 additions & 10 deletions

File tree

zjit/src/hir.rs

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

Comments
 (0)