aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/simplify.c
diff options
context:
space:
mode:
Diffstat (limited to 'simplify.c')
-rw-r--r--simplify.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/simplify.c b/simplify.c
index 0353642b..3c4ace3c 100644
--- a/simplify.c
+++ b/simplify.c
@@ -1818,10 +1818,12 @@ static int simplify_associative_binop(struct instruction *insn)
insn->src2 = eval_op(insn->opcode, insn->size, insn->src2, def->src2);
return replace_pseudo(insn, &insn->src1, def->src1);
}
- if (!one_use(def->target))
- return 0;
- switch_pseudo(def, &def->src1, insn, &insn->src2);
- return REPEAT_CSE;
+
+ if (!canonical_order(def->src1, insn->src2) && can_move_to(insn->src2, def)) {
+ // (x # y) # z -> (z # y) # x when x ≻ z
+ return switch_pseudo(def, &def->src1, insn, &insn->src2);
+ }
+ return 0;
}
static int simplify_add_one_side(struct instruction *insn, pseudo_t *p1, pseudo_t *p2)