diff options
author | Devang Patel <dpatel@apple.com> | 2005-11-08 12:21:15 -0800 |
---|---|---|
committer | Devang Patel <dpatel@gcc.gnu.org> | 2005-11-08 12:21:15 -0800 |
commit | 90b11b98141152b807f39115ccbc45a1fa4b6556 (patch) | |
tree | 5bd13dafae634219e30f383bea77e97014e3ee50 /gcc/tree-if-conv.c | |
parent | 30c055954235cea8114e0918f2c35783d28f16f0 (diff) | |
download | gcc-90b11b98141152b807f39115ccbc45a1fa4b6556.zip gcc-90b11b98141152b807f39115ccbc45a1fa4b6556.tar.gz gcc-90b11b98141152b807f39115ccbc45a1fa4b6556.tar.bz2 |
re PR tree-optimization/23115 (-ftree-vectorize generates wrong code)
PR tree-optimization/23115
* tree-if-conv.c (find_phi_replacement_condition): Check domninated_by
relation.
* gcc.dg/tree-ssa/pr23115.c: New.
From-SVN: r106653
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r-- | gcc/tree-if-conv.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 303ae2b..5d8375d 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -679,7 +679,7 @@ find_phi_replacement_condition (struct loop *loop, S2: x = c ? b : a; S2 is preferred over S1. Make 'b' first_bb and use its condition. - + 2) Do not make loop header first_bb. 3) @@ -691,7 +691,10 @@ find_phi_replacement_condition (struct loop *loop, S3: x = (c == d) ? b : a; S3 is preferred over S1 and S2*, Make 'b' first_bb and use - its condition. */ + its condition. + + 4) If pred B is dominated by pred A then use pred B's condition. + See PR23115. */ /* Select condition that is not TRUTH_NOT_EXPR. */ tmp_cond = first_bb->aux; @@ -703,8 +706,10 @@ find_phi_replacement_condition (struct loop *loop, second_bb = tmp_bb; } - /* Check if FIRST_BB is loop header or not. */ - if (first_bb == loop->header) + /* Check if FIRST_BB is loop header or not and make sure that + FIRST_BB does not dominate SECOND_BB. */ + if (first_bb == loop->header + || dominated_by_p (CDI_DOMINATORS, second_bb, first_bb)) { tmp_cond = second_bb->aux; if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR) |