aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-01-15 14:31:57 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-01-16 09:43:03 +0100
commitea1deefe54ea1c5182bfa179abf36469c9ec6974 (patch)
treeb479d7423dfe5b26f2dd47e41f5fee856dbecb2b
parent7f5adfd31b3af08924faec36679eaea40a98af19 (diff)
downloadgcc-ea1deefe54ea1c5182bfa179abf36469c9ec6974.zip
gcc-ea1deefe54ea1c5182bfa179abf36469c9ec6974.tar.gz
gcc-ea1deefe54ea1c5182bfa179abf36469c9ec6974.tar.bz2
tree-optimization/115494 - PRE PHI translation and ranges
When we PHI translate dependent expressions we keep SSA defs in place of the translated expression in case the expression itself did not change even though it's context did and thus the validity of ranges associated with it. That eventually leads to simplification errors given we violate the precondition that used SSA defs fed to vn_valueize are valid to use (including their associated ranges). The following makes sure to replace those with new representatives always, not only when the dependent expression translation changed it. The fix was originally discovered by Michael Morin. PR tree-optimization/115494 * tree-ssa-pre.cc (phi_translate_1): Always generate a representative for translated dependent expressions. * gcc.dg/torture/pr115494.c: New testcase. Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org>
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr115494.c24
-rw-r--r--gcc/tree-ssa-pre.cc4
2 files changed, 26 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr115494.c b/gcc/testsuite/gcc.dg/torture/pr115494.c
new file mode 100644
index 0000000..a8c6144
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr115494.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+unsigned char a;
+int b = 1, c, d;
+int __attribute__((noipa))
+f()
+{
+ char e;
+ c = b - c;
+ a = ~(c || a);
+ e = -(b ^ a);
+ d = e && b;
+ a = ~(b & a);
+ if (a < 2)
+ return 1;
+ return 0;
+}
+
+int main()
+{
+ if (f())
+ __builtin_abort();
+}
+
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index 32bcd9b..735893b 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -1430,7 +1430,7 @@ phi_translate_1 (bitmap_set_t dest,
unsigned int op_val_id = VN_INFO (newnary->op[i])->value_id;
leader = find_leader_in_sets (op_val_id, set1, set2);
result = phi_translate (dest, leader, set1, set2, e);
- if (result && result != leader)
+ if (result)
/* If op has a leader in the sets we translate make
sure to use the value of the translated expression.
We might need a new representative for that. */
@@ -1553,7 +1553,7 @@ phi_translate_1 (bitmap_set_t dest,
op_val_id = VN_INFO (op[n])->value_id;
leader = find_leader_in_sets (op_val_id, set1, set2);
opresult = phi_translate (dest, leader, set1, set2, e);
- if (opresult && opresult != leader)
+ if (opresult)
{
tree name = get_representative_for (opresult);
changed |= name != op[n];