aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@gcc.gnu.org>2006-11-21 23:45:21 +0000
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-11-21 23:45:21 +0000
commitbf8dbe38637ce885c1b7af763f7728955083195e (patch)
tree227094b35bc9ee38d5a4faf20007c767c35a5d58 /gcc
parentda2a24c3f60194266096c3b807798fbc20d38a7f (diff)
downloadgcc-bf8dbe38637ce885c1b7af763f7728955083195e.zip
gcc-bf8dbe38637ce885c1b7af763f7728955083195e.tar.gz
gcc-bf8dbe38637ce885c1b7af763f7728955083195e.tar.bz2
re PR tree-optimization/29902 (ICE in coalesce_abnormal_edges, at tree-outof-ssa.c:644)
PR tree-optimization/29902 * tree-ssa-loop-manip.c (can_unroll_loop_p): Return false if any involved ssa name appears in abnormal phi node. * g++.dg/tree-ssa/pr29902.C: New test. From-SVN: r119074
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr29902.C19
-rw-r--r--gcc/tree-ssa-loop-manip.c11
4 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c05926..fb72e0a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-22 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/29902
+ * tree-ssa-loop-manip.c (can_unroll_loop_p): Return false if
+ any involved ssa name appears in abnormal phi node.
+
2006-11-21 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (xtensa_char_to_class): Delete.
@@ -19,7 +25,7 @@
2006-11-21 Janis Johnson <janis187@us.ibm.com>
* config/dfp-bits.c (DFP_TO_INT): Remove code to saturate result
- of conversion that doesn't fit.
+ of conversion that doesn't fit.
* config/dfp-bit.h (CONTEXT_TRAPS, CONTEXT_ERRORS, DFP_RAISE): Delete.
* config/dfp-bit.c (dfp_unary_op, dfp_binary_op, dfp_compare_op,
@@ -29,7 +35,7 @@
2006-11-21 Douglas Gregor <doug.gregor@gmail.com>
- * c-common.h (enum rid): Add RID_STATIC_ASSERT.
+ * c-common.h (enum rid): Add RID_STATIC_ASSERT.
2006-11-21 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f4e5182..58ed09d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-11-22 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/29902
+ * g++.dg/tree-ssa/pr29902.C: New test.
+
2006-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29820
@@ -9,9 +14,9 @@
2006-11-21 Douglas Gregor <doug.gregor@gmail.com>
- * g++.dg/cpp0x/static_assert1.C: New.
- * g++.dg/cpp0x/static_assert2.C: New.
- * g++.dg/cpp0x/static_assert3.C: New.
+ * g++.dg/cpp0x/static_assert1.C: New.
+ * g++.dg/cpp0x/static_assert2.C: New.
+ * g++.dg/cpp0x/static_assert3.C: New.
2006-11-21 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr29902.C b/gcc/testsuite/g++.dg/tree-ssa/pr29902.C
new file mode 100644
index 0000000..c81101d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr29902.C
@@ -0,0 +1,19 @@
+/* { dg-do compile { target i?86-*-* } } */
+/* { dg-options "-O1 -fprefetch-loop-arrays -march=athlon" } */
+
+int length1();
+int g(int);
+void f(int capacity_, char *old_storage)
+{
+ try {
+ length1();
+ int old_capacity = capacity_;
+ capacity_ *= 2;
+ g(capacity_);
+ for (int i = 1; i < old_capacity; i++)
+ old_storage[i] = old_storage[i - 1];
+ } catch (...) {
+ for (int i = 1; i < capacity_; i++){old_storage[i] = 0;}
+ }
+}
+
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index 68e0fa6..a23c787 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -625,7 +625,16 @@ can_unroll_loop_p (struct loop *loop, unsigned factor,
return false;
if (!number_of_iterations_exit (loop, exit, niter, false)
- || niter->cmp == ERROR_MARK)
+ || niter->cmp == ERROR_MARK
+ /* Scalar evolutions analysis might have copy propagated
+ the abnormal ssa names into these expressions, hence
+ emiting the computations based on them during loop
+ unrolling might create overlapping life ranges for
+ them, and failures in out-of-ssa. */
+ || contains_abnormal_ssa_name_p (niter->may_be_zero)
+ || contains_abnormal_ssa_name_p (niter->control.base)
+ || contains_abnormal_ssa_name_p (niter->control.step)
+ || contains_abnormal_ssa_name_p (niter->bound))
return false;
/* And of course, we must be able to duplicate the loop. */