aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-if-conv.c
diff options
context:
space:
mode:
authorYuri Rumyantsev <ysrumyan@gmail.com>2014-07-08 07:52:12 +0000
committerKirill Yukhin <kyukhin@gcc.gnu.org>2014-07-08 07:52:12 +0000
commit0f6284d27f11d16cced47627deb022041f8c9cac (patch)
treefd782f878125aa7106ac5a7c54a0d726e5abe2e1 /gcc/tree-if-conv.c
parent605f12f4dcb80940461150cfa9427a12653d8ed3 (diff)
downloadgcc-0f6284d27f11d16cced47627deb022041f8c9cac.zip
gcc-0f6284d27f11d16cced47627deb022041f8c9cac.tar.gz
gcc-0f6284d27f11d16cced47627deb022041f8c9cac.tar.bz2
re PR tree-optimization/61576 (wrong code at -O3 on x86_64-linux-gnu)
PR tree-optimization/61576 gcc/ * tree-if-conv.c (is_cond_scalar_reduction): Add check that basic block containing reduction statement is predecessor of phi basi block. gcc/testsuite/ * gcc.dg/torture/pr61576.c: New test. From-SVN: r212347
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r--gcc/tree-if-conv.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 36a879d..98962c2 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -1407,7 +1407,8 @@ is_cond_scalar_reduction (gimple phi, gimple *reduc,
gimple stmt;
gimple header_phi = NULL;
enum tree_code reduction_op;
- struct loop *loop = gimple_bb (phi)->loop_father;
+ basic_block bb = gimple_bb (phi);
+ struct loop *loop = bb->loop_father;
edge latch_e = loop_latch_edge (loop);
imm_use_iterator imm_iter;
use_operand_p use_p;
@@ -1447,6 +1448,11 @@ is_cond_scalar_reduction (gimple phi, gimple *reduc,
if (!is_predicated (gimple_bb (stmt)))
return false;
+ /* Check that stmt-block is predecessor of phi-block. */
+ if (EDGE_PRED (bb, 0)->src != gimple_bb (stmt)
+ && EDGE_PRED (bb, 1)->src != gimple_bb (stmt))
+ return false;
+
if (!has_single_use (lhs))
return false;