diff options
author | Richard Biener <rguenther@suse.de> | 2013-05-28 10:54:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-05-28 10:54:33 +0000 |
commit | bd388c2a87709ba917054a7450a4d39d2d97635d (patch) | |
tree | 34763bca901a18ba611246d8dcc7815e94f98701 /gcc | |
parent | 95f803bd9be56121561ca21da8063dcf8a368d74 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr57411.C | 23 | ||||
-rw-r--r-- | gcc/tree-ssa-copy.c | 10 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 17 |
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 |