From bf8dbe38637ce885c1b7af763f7728955083195e Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak <rakdver@gcc.gnu.org> Date: Tue, 21 Nov 2006 23:45:21 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 10 ++++++++-- gcc/testsuite/ChangeLog | 11 ++++++++--- gcc/testsuite/g++.dg/tree-ssa/pr29902.C | 19 +++++++++++++++++++ gcc/tree-ssa-loop-manip.c | 11 ++++++++++- 4 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr29902.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c05926a8c7e..fb72e0a2f6ef 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 f4e5182233b2..58ed09da58be 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 000000000000..c81101d1a0a4 --- /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 68e0fa6fe492..a23c787ccbef 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. */ -- GitLab