From e639b20676a9eab048bfdcf007b7ab3b6398a845 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Wed, 10 Nov 2010 16:06:47 +0000 Subject: [PATCH] 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. From-SVN: r166544 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/O3-pr45971.c | 13 +++++++++++++ gcc/tree-if-conv.c | 10 +++++++--- 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/O3-pr45971.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0f89586ba9..09dd6ccd0c9 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 92a850909a5..e8fe4c48c13 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 00000000000..1b7c65c8066 --- /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 17b66721e5d..fc6584584c1 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 {