egraphs: disable GVN of effectful idempotent ops (temporarily). (#5808)
This is a short-term fix to the same bug that #5800 is addressing (#5796), but with less risk: it simply turns off GVN'ing of effectful but idempotent ops. Because we have an upcoming release, and this is a miscompile (albeit to do with trapping behavior), we would like to make the simplest possible fix that avoids the bug, and backport it. I will then rebase #5800 on top of a revert of this followed by the more complete fix.
This commit is contained in:
@@ -73,25 +73,6 @@ pub fn is_pure_for_egraph(func: &Function, inst: Inst) -> bool {
|
||||
has_one_result && (is_readonly_load || (!op.can_load() && !trivially_has_side_effects(op)))
|
||||
}
|
||||
|
||||
/// Can the given instruction be merged into another copy of itself?
|
||||
/// These instructions may have side-effects, but as long as we retain
|
||||
/// the first instance of the instruction, the second and further
|
||||
/// instances are redundant if they would produce the same trap or
|
||||
/// result.
|
||||
pub fn is_mergeable_for_egraph(func: &Function, inst: Inst) -> bool {
|
||||
let op = func.dfg.insts[inst].opcode();
|
||||
// We can only merge one-result operators due to the way that GVN
|
||||
// is structured in the egraph implementation.
|
||||
let has_one_result = func.dfg.inst_results(inst).len() == 1;
|
||||
has_one_result
|
||||
// Loads/stores are handled by alias analysis and not
|
||||
// otherwise mergeable.
|
||||
&& !op.can_load()
|
||||
&& !op.can_store()
|
||||
// Can only have idempotent side-effects.
|
||||
&& (!has_side_effect(func, inst) || op.side_effects_idempotent())
|
||||
}
|
||||
|
||||
/// Does the given instruction have any side-effect as per [has_side_effect], or else is a load,
|
||||
/// but not the get_pinned_reg opcode?
|
||||
pub fn has_lowering_side_effect(func: &Function, inst: Inst) -> bool {
|
||||
|
||||
Reference in New Issue
Block a user