aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-05-28 10:54:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-05-28 10:54:33 +0000
commitbd388c2a87709ba917054a7450a4d39d2d97635d (patch)
tree34763bca901a18ba611246d8dcc7815e94f98701 /gcc
parent95f803bd9be56121561ca21da8063dcf8a368d74 (diff)
downloadgcc-bd388c2a87709ba917054a7450a4d39d2d97635d.zip
gcc-bd388c2a87709ba917054a7450a4d39d2d97635d.tar.gz
gcc-bd388c2a87709ba917054a7450a4d39d2d97635d.tar.bz2
re PR tree-optimization/57411 (ICE: verify_ssa failed: definition in block 4 does not dominate use in block 11 with -fno-tree-dce -ftree-vectorize)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr57411.C23
-rw-r--r--gcc/tree-ssa-copy.c10
-rw-r--r--gcc/tree-ssa-dom.c17
5 files changed, 55 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cd218ab..a7cc93d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c0443c9..c62514c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..9c99ee0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr57411.C
@@ -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 ();
+}
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
index f58f7b3..625f46e 100644
--- a/gcc/tree-ssa-copy.c
+++ b/gcc/tree-ssa-copy.c
@@ -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;
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 602289d..83ca27a 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -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