+2015-12-16 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/68870
+ * tree-cfgcleanup.c (cleanup_control_expr_graph): Add first_p
+ parameter, if set only perform trivial constant folding.
+ Queue other blocks with conditions for later processing.
+ (cleanup_control_flow_bb): Add first_p parameter and pass it through.
+ (cleanup_tree_cfg_1): Pass true for the first iteration
+ cleanup_control_expr_graph.
+
2015-12-16 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx-protos.h (nvptx_hard_regno_mode_ok): Delete.
at block BB. */
static bool
-cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
+cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi,
+ bool first_p)
{
edge taken_edge;
bool retval = false;
switch (gimple_code (stmt))
{
case GIMPLE_COND:
- {
- code_helper rcode;
- tree ops[3] = {};
- if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges,
- no_follow_ssa_edges)
- && rcode == INTEGER_CST)
- val = ops[0];
- break;
- }
+ /* During a first iteration on the CFG only remove trivially
+ dead edges but mark other conditions for re-evaluation. */
+ if (first_p)
+ {
+ val = const_binop (gimple_cond_code (stmt), boolean_type_node,
+ gimple_cond_lhs (stmt),
+ gimple_cond_rhs (stmt));
+ if (! val)
+ bitmap_set_bit (cfgcleanup_altered_bbs, bb->index);
+ }
+ else
+ {
+ code_helper rcode;
+ tree ops[3] = {};
+ if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges,
+ no_follow_ssa_edges)
+ && rcode == INTEGER_CST)
+ val = ops[0];
+ }
+ break;
case GIMPLE_SWITCH:
val = gimple_switch_index (as_a <gswitch *> (stmt));
true if anything changes. */
static bool
-cleanup_control_flow_bb (basic_block bb)
+cleanup_control_flow_bb (basic_block bb, bool first_p)
{
gimple_stmt_iterator gsi;
bool retval = false;
|| gimple_code (stmt) == GIMPLE_SWITCH)
{
gcc_checking_assert (gsi_stmt (gsi_last_bb (bb)) == stmt);
- retval |= cleanup_control_expr_graph (bb, gsi);
+ retval |= cleanup_control_expr_graph (bb, gsi, first_p);
}
else if (gimple_code (stmt) == GIMPLE_GOTO
&& TREE_CODE (gimple_goto_dest (stmt)) == ADDR_EXPR
{
bb = BASIC_BLOCK_FOR_FN (cfun, i);
if (bb)
- retval |= cleanup_control_flow_bb (bb);
+ retval |= cleanup_control_flow_bb (bb, true);
}
/* After doing the above SSA form should be valid (or an update SSA
if (!bb)
continue;
- retval |= cleanup_control_flow_bb (bb);
+ retval |= cleanup_control_flow_bb (bb, false);
retval |= cleanup_tree_cfg_bb (bb);
}