re PR tree-optimization/57411 (ICE: verify_ssa failed: definition in block 4 does...
authorRichard Biener <rguenther@suse.de>
Tue, 28 May 2013 10:54:33 +0000 (10:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 28 May 2013 10:54:33 +0000 (10:54 +0000)
2013-05-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/57411
* tree-ssa-copy.c (may_propagate_copy): Cannot propagate
virtual operands.
* tree-ssa-dom.c (eliminate_const_or_copy): Special-case
virtual operand propagation.

* g++.dg/opt/pr57411.C: New testcase.

From-SVN: r199374

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr57411.C [new file with mode: 0644]
gcc/tree-ssa-copy.c
gcc/tree-ssa-dom.c

index cd218ab1591187096f72698effbcf002718431a6..a7cc93d151325e8b6640e8c05588e863d310fa5a 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57411
+       * tree-ssa-copy.c (may_propagate_copy): Cannot propagate
+       virtual operands.
+       * tree-ssa-dom.c (eliminate_const_or_copy): Special-case
+       virtual operand propagation.
+
 2013-05-28  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.c (sparc_expand_vec_perm_bmask): Use %g0 as
index c0443c9ec474fb0bcfef2b0da2c12edfcb0d3e3e..c62514c99821fa544c4fab6fc217757354d6ef5f 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57411
+       * g++.dg/opt/pr57411.C: New testcase.
+
 2013-05-28  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/builtin-bswap-8.c: Compile at -O2.
diff --git a/gcc/testsuite/g++.dg/opt/pr57411.C b/gcc/testsuite/g++.dg/opt/pr57411.C
new file mode 100644 (file)
index 0000000..9c99ee0
--- /dev/null
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O -fno-tree-dce -ftree-vectorize" }
+
+static inline void
+iota (int *__first, int *__last, int __value)
+{
+  for (; __first != __last; ++__first)
+    {
+      *__first = __value;
+    }
+}
+
+void assert_fail ();
+
+int A[] = { 0, 0, 0 };
+
+void
+test01 (int equal)
+{
+  iota (A, A + 3, 1);
+  if (equal)
+    assert_fail ();
+}
index f58f7b3a0ecabf8b7ef3e8fb50f86f2d5343d3b9..625f46e19429e32383c75dfebc8c0e6af0d49554 100644 (file)
@@ -73,14 +73,10 @@ may_propagate_copy (tree dest, tree orig)
   if (!useless_type_conversion_p (type_d, type_o))
     return false;
 
-  /* Propagating virtual operands is always ok.  */
+  /* Generally propagating virtual operands is not ok as that may
+     create overlapping life-ranges.  */
   if (TREE_CODE (dest) == SSA_NAME && virtual_operand_p (dest))
-    {
-      /* But only between virtual operands.  */
-      gcc_assert (TREE_CODE (orig) == SSA_NAME && virtual_operand_p (orig));
-
-      return true;
-    }
+    return false;
 
   /* Anything else is OK.  */
   return true;
index 602289d78865a0af6efb37a35b2b19773e4eda8f..83ca27a0bf4ada27078c8cd0473b14859bbf6501 100644 (file)
@@ -2936,7 +2936,22 @@ eliminate_const_or_copy (gimple stmt, bitmap interesting_names)
       return;
     }
 
-  propagate_rhs_into_lhs (stmt, lhs, rhs, interesting_names);
+  if (!virtual_operand_p (lhs))
+    propagate_rhs_into_lhs (stmt, lhs, rhs, interesting_names);
+  else
+    {
+      gimple use_stmt;
+      imm_use_iterator iter;
+      use_operand_p use_p;
+      /* For virtual operands we have to propagate into all uses as
+         otherwise we will create overlapping life-ranges.  */
+      FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
+       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
+         SET_USE (use_p, rhs);
+      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs) = 1;
+      remove_stmt_or_phi (stmt);
+    }
 
   /* Note that STMT may well have been deleted by now, so do
      not access it, instead use the saved version # to clear