Fix PR45971: do not predicate condition phi nodes that are scev analyzable.
authorSebastian Pop <sebastian.pop@amd.com>
Wed, 10 Nov 2010 16:06:47 +0000 (16:06 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Wed, 10 Nov 2010 16:06:47 +0000 (16:06 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/O3-pr45971.c [new file with mode: 0644]
gcc/tree-if-conv.c

index e0f89586ba90dd7bb24c4a46645208fa5cd0ade9..09dd6ccd0c97eb531d29cdc493e98c3a22a68560 100644 (file)
@@ -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
index 92a850909a596cf38790d26736e31d0d7482f5d6..e8fe4c48c13386e2f171a23c96bf5ac0ae97bcd6 100644 (file)
@@ -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 (file)
index 0000000..1b7c65c
--- /dev/null
@@ -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" } } */
+
index 17b66721e5d25b3227643037fb1290c1af9f509c..fc6584584c14763e6fcccb2ba025369967f61452 100644 (file)
@@ -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
     {