From 073924283c3944e098ae1011b58d31e0d05bdbcd Mon Sep 17 00:00:00 2001 From: rakdver Date: Tue, 21 Nov 2006 23:45:21 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119074 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 6c05926a8c7..fb72e0a2f6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-11-22 Zdenek Dvorak + + 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 * config/xtensa/xtensa.c (xtensa_char_to_class): Delete. @@ -19,7 +25,7 @@ 2006-11-21 Janis Johnson * 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 - * c-common.h (enum rid): Add RID_STATIC_ASSERT. + * c-common.h (enum rid): Add RID_STATIC_ASSERT. 2006-11-21 Richard Guenther diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4e5182233b..58ed09da58b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-22 Zdenek Dvorak + + PR tree-optimization/29902 + * g++.dg/tree-ssa/pr29902.C: New test. + 2006-11-21 Paul Thomas PR fortran/29820 @@ -9,9 +14,9 @@ 2006-11-21 Douglas Gregor - * 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 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 00000000000..c81101d1a0a --- /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 68e0fa6fe49..a23c787ccbe 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. */ -- 2.11.4.GIT