[gcc r11-7762] tree-optimization/99694 - fix value-numbering PHIs

Richard Biener rguenth@gcc.gnu.org
Mon Mar 22 13:37:38 GMT 2021


https://gcc.gnu.org/g:b931e4792b8696f3da69f70988720c4d1ec6142a

commit r11-7762-gb931e4792b8696f3da69f70988720c4d1ec6142a
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Mar 22 11:09:46 2021 +0100

    tree-optimization/99694 - fix value-numbering PHIs
    
    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.

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr99694.c | 27 +++++++++++++++++++++++++++
 gcc/tree-ssa-sccvn.c                   |  2 ++
 2 files changed, 29 insertions(+)

diff --git a/gcc/testsuite/gcc.dg/torture/pr99694.c b/gcc/testsuite/gcc.dg/torture/pr99694.c
new file mode 100644
index 00000000000..df316961673
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr99694.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 99759a8744a..1c0500ce61e 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -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)
 	  {


More information about the Gcc-cvs mailing list