From a82a315b1e0c2ea8f8c787190e6b8256b341bd38 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sat, 3 Mar 2007 01:38:56 +0100 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: r122501 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr29902.C | 19 +++++++++++++++++++ gcc/tree-ssa-loop-manip.c | 11 ++++++++++- 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr29902.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2bc64fe6c4c..9022ba41f12e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-02 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. + 2007-03-02 Eric Botcazou * tree-sra.c (sra_walk_fns) : Document new restriction. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7bc239152312..5292fdd19b51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-02 Zdenek Dvorak + + PR tree-optimization/29902 + * g++.dg/tree-ssa/pr29902.C: New test. + 2007-03-01 Tobias Schlueter Backport from trunk 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 0b29c5ee8b48..eda9adf653ab 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -651,7 +651,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. */