]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/107935 - fixup equivalence handling in PHI VN
authorRichard Biener <rguenther@suse.de>
Thu, 1 Dec 2022 08:01:20 +0000 (09:01 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 1 Dec 2022 09:18:46 +0000 (10:18 +0100)
The following makes sure to honor the backedge processing logic
that forces VARYING there.

PR tree-optimization/107935
* tree-ssa-sccvn.cc (visit_phi): Honor forced VARYING on
backedges.

* gcc.dg/torture/pr107935.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr107935.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr107935.c b/gcc/testsuite/gcc.dg/torture/pr107935.c
new file mode 100644 (file)
index 0000000..7817510
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+int *a, **b;
+int main() {
+  int d = 0, *e = &d;
+ L:
+  *e = d;
+  if (a) {
+    int *g = e = *b;
+    if (!e)
+      __builtin_abort();
+    if (**b)
+      return 0;
+    *g = 1;
+    goto L;
+  }
+  return 0;
+}
index 1e7763baa38e9891f70cb883fddc9488dcb40ea6..b9f289b6ecadf5c2c156aa916940756f04069029 100644 (file)
@@ -5840,7 +5840,12 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
                  continue;
              }
            /* There's also the possibility to use equivalences.  */
-           if (!FLOAT_TYPE_P (TREE_TYPE (def)))
+           if (!FLOAT_TYPE_P (TREE_TYPE (def))
+               /* But only do this if we didn't force any of sameval or
+                  val to VARYING because of backedge processing rules.  */
+               && (TREE_CODE (sameval) != SSA_NAME
+                   || SSA_VAL (sameval) == sameval)
+               && (TREE_CODE (def) != SSA_NAME || SSA_VAL (def) == def))
              {
                vn_nary_op_t vnresult;
                tree ops[2];