re PR tree-optimization/87402 (ICE in set_ssa_val_to, at tree-ssa-sccvn.c:3645)
authorRichard Biener <rguenther@suse.de>
Tue, 25 Sep 2018 12:51:57 +0000 (12:51 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 25 Sep 2018 12:51:57 +0000 (12:51 +0000)
2018-09-25  Richard Biener  <rguenther@suse.de>

PR tree-optimization/87402
* tree-ssa-sccvn.c (SSA_VISITED): Remove unused function.
(visit_phi): Re-instantiate handling of supposed to be VARYING
but non-VARYING backedge value.

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

From-SVN: r264566

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

index 61422ada6f1383452ec362231bc2bca2224cfe33..b81172f2900987b74e63f0e00520c329d9e4bd97 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87402
+       * tree-ssa-sccvn.c (SSA_VISITED): Remove unused function.
+       (visit_phi): Re-instantiate handling of supposed to be VARYING
+       but non-VARYING backedge value.
+
 2018-09-25  Richard Biener  <rguenther@suse.de>
 
        PR debug/83941
index af269f425fc12b6df78d20b9e121e9de305c0271..76a8a86330905b77865d84ca3affe88ea9294a04 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87402
+       * gcc.dg/torture/pr87402.c: New testcase.
+
 2018-09-25  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR testsuite/70150
diff --git a/gcc/testsuite/gcc.dg/torture/pr87402.c b/gcc/testsuite/gcc.dg/torture/pr87402.c
new file mode 100644 (file)
index 0000000..a27ac4f
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+
+void
+xl (int co)
+{
+  int ar = 0;
+
+  if (ar != 0)
+    {
+      int pp, ll = 0;
+      int *zx;
+
+      if (co == 0)
+       {
+       }
+      else
+       {
+         zx = &pp;
+
+         if (co < 0)
+           while (co < 1)
+             {
+to:
+               while (ll < 1)
+                 ++ll;
+             }
+
+         *zx = (__INTPTR_TYPE__)&ar;
+       }
+    }
+
+  goto to;
+}
index cee3d73a75b1eb0171e2264a8f84668f43b823aa..5a05dfb564062b5090fbdbadd6f06729d8ab396a 100644 (file)
@@ -464,15 +464,6 @@ SSA_VAL (tree x, bool *visited = NULL)
   return tem && tem->visited ? tem->valnum : x;
 }
 
-/* Return whether X was visited.  */
-
-inline bool
-SSA_VISITED (tree x)
-{
-  vn_ssa_aux_t tem = vn_ssa_aux_hash->find_with_hash (x, SSA_NAME_VERSION (x));
-  return tem && tem->visited;
-}
-
 /* Return the SSA value of the VUSE x, supporting released VDEFs
    during elimination which will value-number the VDEF to the
    associated VUSE (but not substitute in the whole lattice).  */
@@ -4196,7 +4187,10 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
          }
       }
 
-  /* If we value-number a virtual operand never value-number to the
+  /* If the value we want to use is flowing over the backedge and we
+     should take it as VARYING but it has a non-VARYING value drop to
+     VARYING.
+     If we value-number a virtual operand never value-number to the
      value from the backedge as that confuses the alias-walking code.
      See gcc.dg/torture/pr87176.c.  If the value is the same on a
      non-backedge everything is OK though.  */
@@ -4204,7 +4198,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
       && !seen_non_backedge
       && TREE_CODE (backedge_val) == SSA_NAME
       && sameval == backedge_val
-      && SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val))
+      && (SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val)
+         || SSA_VAL (backedge_val) != backedge_val))
     /* Note this just drops to VARYING without inserting the PHI into
        the hashes.  */
     result = PHI_RESULT (phi);