aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--simplify.c10
-rw-r--r--validation/reassoc/bug-zephyr-63417.c13
2 files changed, 19 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)
diff --git a/validation/reassoc/bug-zephyr-63417.c b/validation/reassoc/bug-zephyr-63417.c
new file mode 100644
index 00000000..5db821d3
--- /dev/null
+++ b/validation/reassoc/bug-zephyr-63417.c
@@ -0,0 +1,13 @@
+extern char __tdata_size[];
+extern char __tdata_align[];
+
+unsigned long z_tls_data_size(void);
+unsigned long z_tls_data_size(void)
+{
+ return ((unsigned long)__tdata_size) + ((unsigned long)__tdata_align - 1);
+}
+
+/*
+ * check-name: bug-zephyr-63417
+ * check-timeout:
+ */