Commit 067339d2 by Alexandre Oliva Committed by Alexandre Oliva

ifcombine: factor out inner block viability test

Bail out early if the inner block has side effects or is otherwise not
eligible for ifcombine.

for  gcc/ChangeLog

	* tree-ssa-ifcombine.c (tree_ssa_ifcombine_bb_1): Factor out
	bb_no_side_effects_p tests...
	(tree_ssa_ifcombine_bb): ... here.

From-SVN: r229691
parent 828ca3d8
2015-11-02 Alexandre Oliva <aoliva@redhat.com> 2015-11-02 Alexandre Oliva <aoliva@redhat.com>
* tree-ssa-ifcombine.c (tree_ssa_ifcombine_bb_1): Factor out
bb_no_side_effects_p tests...
(tree_ssa_ifcombine_bb): ... here.
PR tree-optimization/68083 PR tree-optimization/68083
* tree-ssa-ifcombine.c: Include tree-ssa.h. * tree-ssa-ifcombine.c: Include tree-ssa.h.
(bb_no_side_effects_p): Test for undefined uses too. (bb_no_side_effects_p): Test for undefined uses too.
...@@ -576,8 +576,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb, ...@@ -576,8 +576,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb,
the inner cond_bb having no side-effects. */ the inner cond_bb having no side-effects. */
if (phi_pred_bb != else_bb if (phi_pred_bb != else_bb
&& recognize_if_then_else (outer_cond_bb, &inner_cond_bb, &else_bb) && recognize_if_then_else (outer_cond_bb, &inner_cond_bb, &else_bb)
&& same_phi_args_p (outer_cond_bb, phi_pred_bb, else_bb) && same_phi_args_p (outer_cond_bb, phi_pred_bb, else_bb))
&& bb_no_side_effects_p (inner_cond_bb))
{ {
/* We have /* We have
<outer_cond_bb> <outer_cond_bb>
...@@ -595,8 +594,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb, ...@@ -595,8 +594,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb,
/* And a version where the outer condition is negated. */ /* And a version where the outer condition is negated. */
if (phi_pred_bb != else_bb if (phi_pred_bb != else_bb
&& recognize_if_then_else (outer_cond_bb, &else_bb, &inner_cond_bb) && recognize_if_then_else (outer_cond_bb, &else_bb, &inner_cond_bb)
&& same_phi_args_p (outer_cond_bb, phi_pred_bb, else_bb) && same_phi_args_p (outer_cond_bb, phi_pred_bb, else_bb))
&& bb_no_side_effects_p (inner_cond_bb))
{ {
/* We have /* We have
<outer_cond_bb> <outer_cond_bb>
...@@ -617,8 +615,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb, ...@@ -617,8 +615,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb,
having no side-effects. */ having no side-effects. */
if (phi_pred_bb != then_bb if (phi_pred_bb != then_bb
&& recognize_if_then_else (outer_cond_bb, &then_bb, &inner_cond_bb) && recognize_if_then_else (outer_cond_bb, &then_bb, &inner_cond_bb)
&& same_phi_args_p (outer_cond_bb, phi_pred_bb, then_bb) && same_phi_args_p (outer_cond_bb, phi_pred_bb, then_bb))
&& bb_no_side_effects_p (inner_cond_bb))
{ {
/* We have /* We have
<outer_cond_bb> <outer_cond_bb>
...@@ -635,8 +632,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb, ...@@ -635,8 +632,7 @@ tree_ssa_ifcombine_bb_1 (basic_block inner_cond_bb, basic_block outer_cond_bb,
/* And a version where the outer condition is negated. */ /* And a version where the outer condition is negated. */
if (phi_pred_bb != then_bb if (phi_pred_bb != then_bb
&& recognize_if_then_else (outer_cond_bb, &inner_cond_bb, &then_bb) && recognize_if_then_else (outer_cond_bb, &inner_cond_bb, &then_bb)
&& same_phi_args_p (outer_cond_bb, phi_pred_bb, then_bb) && same_phi_args_p (outer_cond_bb, phi_pred_bb, then_bb))
&& bb_no_side_effects_p (inner_cond_bb))
{ {
/* We have /* We have
<outer_cond_bb> <outer_cond_bb>
...@@ -673,7 +669,8 @@ tree_ssa_ifcombine_bb (basic_block inner_cond_bb) ...@@ -673,7 +669,8 @@ tree_ssa_ifcombine_bb (basic_block inner_cond_bb)
if (a && b) if (a && b)
; ;
This requires a single predecessor of the inner cond_bb. */ This requires a single predecessor of the inner cond_bb. */
if (single_pred_p (inner_cond_bb)) if (single_pred_p (inner_cond_bb)
&& bb_no_side_effects_p (inner_cond_bb))
{ {
basic_block outer_cond_bb = single_pred (inner_cond_bb); basic_block outer_cond_bb = single_pred (inner_cond_bb);
......
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