From: spop Date: Wed, 10 Nov 2010 16:06:47 +0000 (+0000) Subject: Fix PR45971: do not predicate condition phi nodes that are scev analyzable. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=119cb9ea7f2025582bc90426ebffe9b52bd4d49c;p=thirdparty%2Fgcc.git Fix PR45971: do not predicate condition phi nodes that are scev analyzable. 2010-11-10 Sebastian Pop PR tree-optimization/45971 * tree-if-conv.c (predicate_scalar_phi): Do not generate a COND_EXPR for phi nodes analyzable by scev. * gcc.dg/vect/O3-pr45971.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166544 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0f89586ba90..09dd6ccd0c97 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-10 Sebastian Pop + + PR tree-optimization/45971 + * tree-if-conv.c (predicate_scalar_phi): Do not generate a COND_EXPR + for phi nodes analyzable by scev. + 2010-11-10 Richard Guenther PR tree-optimization/44964 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 92a850909a59..e8fe4c48c133 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-10 Sebastian Pop + + PR tree-optimization/45971 + * gcc.dg/vect/O3-pr45971.c: New. + 2010-11-10 Richard Guenther PR tree-optimization/44964 diff --git a/gcc/testsuite/gcc.dg/vect/O3-pr45971.c b/gcc/testsuite/gcc.dg/vect/O3-pr45971.c new file mode 100644 index 000000000000..1b7c65c80666 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/O3-pr45971.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +void +foo (int *x, int *y) +{ + int i; + for (i = 0; i < 11; i++) + y[i] = (x[i] == 1) ? i + 1 : -(i + 1); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 17b66721e5d2..fc6584584c14 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -1224,7 +1224,7 @@ predicate_scalar_phi (gimple phi, tree cond, { gimple new_stmt; basic_block bb; - tree rhs, res, arg; + tree rhs, res, arg, scev; gcc_assert (gimple_code (phi) == GIMPLE_PHI && gimple_phi_num_args (phi) == 2); @@ -1236,8 +1236,12 @@ predicate_scalar_phi (gimple phi, tree cond, bb = gimple_bb (phi); - arg = degenerate_phi_result (phi); - if (arg) + if ((arg = degenerate_phi_result (phi)) + || ((scev = analyze_scalar_evolution (gimple_bb (phi)->loop_father, + res)) + && !chrec_contains_undetermined (scev) + && scev != res + && (arg = gimple_phi_arg_def (phi, 0)))) rhs = arg; else {