Commit 1174b21b by Richard Biener Committed by Richard Biener

gimple-ssa-split-paths.c (find_block_to_duplicate_for_splitting_pa): Handle empty else block.

2016-07-05  Richard Biener  <rguenther@suse.de>

	* gimple-ssa-split-paths.c (find_block_to_duplicate_for_splitting_pa):
	Handle empty else block.
	(is_feasible_trace): Likewise.
	(split_paths): Likewise.

From-SVN: r238005
parent 16eba420
2016-07-05 Richard Biener <rguenther@suse.de> 2016-07-05 Richard Biener <rguenther@suse.de>
* gimple-ssa-split-paths.c (find_block_to_duplicate_for_splitting_pa):
Handle empty else block.
(is_feasible_trace): Likewise.
(split_paths): Likewise.
2016-07-05 Richard Biener <rguenther@suse.de>
* tree-loop-distribution.c (distribute_loop): Fix issue with * tree-loop-distribution.c (distribute_loop): Fix issue with
the cost model loop. the cost model loop.
......
...@@ -76,14 +76,19 @@ find_block_to_duplicate_for_splitting_paths (basic_block latch) ...@@ -76,14 +76,19 @@ find_block_to_duplicate_for_splitting_paths (basic_block latch)
return NULL; return NULL;
/* And that BB's immediate dominator's successors are the /* And that BB's immediate dominator's successors are the
predecessors of BB. */ predecessors of BB or BB itself. */
if (!find_edge (bb_idom, EDGE_PRED (bb, 0)->src) if (!(EDGE_PRED (bb, 0)->src == bb_idom
|| !find_edge (bb_idom, EDGE_PRED (bb, 1)->src)) || find_edge (bb_idom, EDGE_PRED (bb, 0)->src))
|| !(EDGE_PRED (bb, 1)->src == bb_idom
|| find_edge (bb_idom, EDGE_PRED (bb, 1)->src)))
return NULL; return NULL;
/* And that the predecessors of BB each have a single successor. */ /* And that the predecessors of BB each have a single successor
if (!single_succ_p (EDGE_PRED (bb, 0)->src) or are BB's immediate domiator itself. */
|| !single_succ_p (EDGE_PRED (bb, 1)->src)) if (!(EDGE_PRED (bb, 0)->src == bb_idom
|| single_succ_p (EDGE_PRED (bb, 0)->src))
|| !(EDGE_PRED (bb, 1)->src == bb_idom
|| single_succ_p (EDGE_PRED (bb, 1)->src)))
return NULL; return NULL;
/* So at this point we have a simple diamond for an IF-THEN-ELSE /* So at this point we have a simple diamond for an IF-THEN-ELSE
...@@ -148,8 +153,10 @@ is_feasible_trace (basic_block bb) ...@@ -148,8 +153,10 @@ is_feasible_trace (basic_block bb)
basic_block pred1 = EDGE_PRED (bb, 0)->src; basic_block pred1 = EDGE_PRED (bb, 0)->src;
basic_block pred2 = EDGE_PRED (bb, 1)->src; basic_block pred2 = EDGE_PRED (bb, 1)->src;
int num_stmts_in_join = count_stmts_in_block (bb); int num_stmts_in_join = count_stmts_in_block (bb);
int num_stmts_in_pred1 = count_stmts_in_block (pred1); int num_stmts_in_pred1
int num_stmts_in_pred2 = count_stmts_in_block (pred2); = EDGE_COUNT (pred1->succs) == 1 ? count_stmts_in_block (pred1) : 0;
int num_stmts_in_pred2
= EDGE_COUNT (pred2->succs) == 1 ? count_stmts_in_block (pred2) : 0;
/* This is meant to catch cases that are likely opportunities for /* This is meant to catch cases that are likely opportunities for
if-conversion. Essentially we look for the case where if-conversion. Essentially we look for the case where
...@@ -292,6 +299,8 @@ split_paths () ...@@ -292,6 +299,8 @@ split_paths ()
"Duplicating join block %d into predecessor paths\n", "Duplicating join block %d into predecessor paths\n",
bb->index); bb->index);
basic_block pred0 = EDGE_PRED (bb, 0)->src; basic_block pred0 = EDGE_PRED (bb, 0)->src;
if (EDGE_COUNT (pred0->succs) != 1)
pred0 = EDGE_PRED (bb, 1)->src;
transform_duplicate (pred0, bb); transform_duplicate (pred0, bb);
changed = true; changed = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment