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
This commit is contained in:
Zdenek Dvorak 2006-11-21 23:45:21 +00:00
parent da2a24c3f6
commit bf8dbe3863
4 changed files with 45 additions and 6 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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;}
}
}

View File

@ -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. */