diff options
author | Yuri Rumyantsev <ysrumyan@gmail.com> | 2014-07-08 07:52:12 +0000 |
---|---|---|
committer | Kirill Yukhin <kyukhin@gcc.gnu.org> | 2014-07-08 07:52:12 +0000 |
commit | 0f6284d27f11d16cced47627deb022041f8c9cac (patch) | |
tree | fd782f878125aa7106ac5a7c54a0d726e5abe2e1 /gcc/tree-if-conv.c | |
parent | 605f12f4dcb80940461150cfa9427a12653d8ed3 (diff) | |
download | gcc-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.c | 8 |
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; |