From 43f56c461f3797d4840f88ca6ecc2fe30a67c210 Mon Sep 17 00:00:00 2001
From: Sebastian Pop <sebpop@gmail.com>
Date: Tue, 9 Nov 2010 14:02:06 -0600
Subject: [PATCH] Fix PR45971: do not predicate condition phi nodes that are scev analyzable.
2010-11-09 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.
---
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
@@ -1,5 +1,11 @@
2010-11-09 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-09 Sebastian Pop <sebastian.pop@amd.com>
+
PR tree-optimization/46036
* tree-if-conv.c (predicate_bbs): Call unshare_expr before
add_to_dst_predicate_list.
@@ -1,5 +1,10 @@
2010-11-09 Sebastian Pop <sebastian.pop@amd.com>
+ PR tree-optimization/45971
+ * gcc.dg/vect/O3-pr45971.c: New.
+
+2010-11-09 Sebastian Pop <sebastian.pop@amd.com>
+
PR tree-optimization/46036
* gfortran.dg/lto/pr46036_0.f90: New.
new file mode 100644
@@ -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" } } */
+
@@ -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
{
--
1.7.0.4