]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/99694 - fix value-numbering PHIs
authorRichard Biener <rguenther@suse.de>
Mon, 22 Mar 2021 10:09:46 +0000 (11:09 +0100)
committerRichard Biener <rguenther@suse.de>
Mon, 22 Mar 2021 13:37:26 +0000 (14:37 +0100)
This avoids endless cycling when a PHI node with unchanged backedge
value (the PHI result appearing there) is subject to CSE since doing
that effectively alters the hash entry.  The way to avoid this is
to ignore such edges when processing the PHI node.

2021-03-22  Richard Biener  <rguenther@suse.de>

PR tree-optimization/99694
* tree-ssa-sccvn.c (visit_phi): Ignore edges with the
PHI result.

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

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

diff --git a/gcc/testsuite/gcc.dg/torture/pr99694.c b/gcc/testsuite/gcc.dg/torture/pr99694.c
new file mode 100644 (file)
index 0000000..df31696
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-w" } */
+
+#include <stdint.h>
+
+int a, b, c;
+void d() {
+  uint16_t e;
+  int32_t *f;
+  int32_t *g;
+  if (a) {
+    int32_t *k;
+    for (;; *k += 1) {
+      int32_t **i = &f;
+      int32_t **l = &g;
+      for (e = 6; e; e++) {
+        g = k = f;
+      j:
+        **l = 0;
+      }
+      *i = c;
+    }
+  }
+  uint16_t i = &e;
+  b = i / 0;
+  goto j;
+}
index 99759a8744a8781c4d699f03d510add45765c23a..1c0500ce61e4014e7e6b04e10d265e9528cbefda 100644 (file)
@@ -5199,6 +5199,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
       {
        tree def = PHI_ARG_DEF_FROM_EDGE (phi, e);
 
+       if (def == PHI_RESULT (phi))
+         continue;
        ++n_executable;
        if (TREE_CODE (def) == SSA_NAME)
          {