diff options
author | Bin Cheng <bin.cheng@arm.com> | 2017-03-28 15:35:56 +0000 |
---|---|---|
committer | Bin Cheng <bin.cheng@arm.com> | 2017-03-28 15:35:56 +0000 |
commit | 6f4d2b95390968792d6e158466890d41f6c0a1cd (patch) | |
tree | 8a5453ed2ca619ddeb6950e881cbe6b779430443 | |
parent | 531da930744c86c751ac9c60f360c174502f5237 (diff) |
* tree-vect-loop.c (optimize_mask_stores): Add bb to the right
loop.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@246541 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 10 |
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa216e904ab..b57d40b0863 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2017-03-28 Bin Cheng <bin.cheng@arm.com> + * tree-vect-loop.c (optimize_mask_stores): Add bb to the right + loop. + +2017-03-28 Bin Cheng <bin.cheng@arm.com> + * tree-vect-loop-manip.c (slpeel_add_loop_guard): New param and mark new edge's irreducible flag accordign to it. (vect_do_peeling): Check loop preheader edge's irreducible flag diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 6bbf8162a86..af874e7ad8e 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -7229,6 +7229,7 @@ optimize_mask_stores (struct loop *loop) unsigned nbbs = loop->num_nodes; unsigned i; basic_block bb; + struct loop *bb_loop; gimple_stmt_iterator gsi; gimple *stmt; auto_vec<gimple *> worklist; @@ -7267,11 +7268,16 @@ optimize_mask_stores (struct loop *loop) last = worklist.pop (); mask = gimple_call_arg (last, 2); bb = gimple_bb (last); - /* Create new bb. */ + /* Create then_bb and if-then structure in CFG, then_bb belongs to + the same loop as if_bb. It could be different to LOOP when two + level loop-nest is vectorized and mask_store belongs to the inner + one. */ e = split_block (bb, last); + bb_loop = bb->loop_father; + gcc_assert (loop == bb_loop || flow_loop_nested_p (loop, bb_loop)); join_bb = e->dest; store_bb = create_empty_bb (bb); - add_bb_to_loop (store_bb, loop); + add_bb_to_loop (store_bb, bb_loop); e->flags = EDGE_TRUE_VALUE; efalse = make_edge (bb, store_bb, EDGE_FALSE_VALUE); /* Put STORE_BB to likely part. */ |