diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2010-11-10 16:06:47 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2010-11-10 16:06:47 +0000 |
commit | e639b20676a9eab048bfdcf007b7ab3b6398a845 (patch) | |
tree | ed8ed8365eea43b3d72b37435d34a18cb7900de2 /gcc | |
parent | 59e0c6b70fdb0c9683597f470d8f795b59812aa8 (diff) | |
download | gcc-e639b20676a9eab048bfdcf007b7ab3b6398a845.zip gcc-e639b20676a9eab048bfdcf007b7ab3b6398a845.tar.gz gcc-e639b20676a9eab048bfdcf007b7ab3b6398a845.tar.bz2 |
Fix PR45971: do not predicate condition phi nodes that are scev analyzable.
2010-11-10 Sebastian Pop <sebastian.pop@amd.com>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/O3-pr45971.c | 13 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 10 |
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0f8958..09dd6cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-10 Sebastian Pop <sebastian.pop@amd.com> + + 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 <rguenther@suse.de> PR tree-optimization/44964 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 92a8509..e8fe4c4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-10 Sebastian Pop <sebastian.pop@amd.com> + + PR tree-optimization/45971 + * gcc.dg/vect/O3-pr45971.c: New. + 2010-11-10 Richard Guenther <rguenther@suse.de> 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 0000000..1b7c65c --- /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 17b6672..fc65845 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 { |