PHIOPT: Mark the conditional lhs and rhs as to look at to see if DCEable
In some cases (usually dealing with bools only), there could be some statements left behind which are considered trivial dead. An example is: ``` bool f(bool a, bool b) { if (!a && !b) return 0; if (!a && b) return 0; if (a && !b) return 0; return 1; } ``` Where during phiopt2, the IR had: ``` _3 = ~b_7(D); _4 = _3 & a_6(D); _4 != 0 ? 0 : 1 ``` match-and-simplify would transform that into: ``` _11 = ~a_6(D); _12 = b_7(D) | _11; ``` But phiopt would leave around the statements defining _4 and _3. This helps by marking the conditional's lhs and rhs to see if they are trivial dead. OK? Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * tree-ssa-phiopt.cc (match_simplify_replacement): Mark's cond statement's lhs and rhs to check if trivial dead. Rename inserted_exprs to exprs_maybe_dce; also move it so bitmap is not allocated if not needed.
This commit is contained in:
parent
21c2815605
commit
7ff1d1b156
1 changed files with 16 additions and 5 deletions
|
@ -767,7 +767,6 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
|
|||
tree result;
|
||||
gimple *stmt_to_move = NULL;
|
||||
gimple *stmt_to_move_alt = NULL;
|
||||
auto_bitmap inserted_exprs;
|
||||
tree arg_true, arg_false;
|
||||
|
||||
/* Special case A ? B : B as this will always simplify to B. */
|
||||
|
@ -844,6 +843,18 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
|
|||
if (!result)
|
||||
return false;
|
||||
|
||||
auto_bitmap exprs_maybe_dce;
|
||||
|
||||
/* Mark the cond statements' lhs/rhs as maybe dce. */
|
||||
if (TREE_CODE (gimple_cond_lhs (stmt)) == SSA_NAME
|
||||
&& !SSA_NAME_IS_DEFAULT_DEF (gimple_cond_lhs (stmt)))
|
||||
bitmap_set_bit (exprs_maybe_dce,
|
||||
SSA_NAME_VERSION (gimple_cond_lhs (stmt)));
|
||||
if (TREE_CODE (gimple_cond_rhs (stmt)) == SSA_NAME
|
||||
&& !SSA_NAME_IS_DEFAULT_DEF (gimple_cond_rhs (stmt)))
|
||||
bitmap_set_bit (exprs_maybe_dce,
|
||||
SSA_NAME_VERSION (gimple_cond_rhs (stmt)));
|
||||
|
||||
gsi = gsi_last_bb (cond_bb);
|
||||
/* Insert the sequence generated from gimple_simplify_phiopt. */
|
||||
if (seq)
|
||||
|
@ -855,7 +866,7 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
|
|||
gimple *stmt = gsi_stmt (gsi1);
|
||||
tree name = gimple_get_lhs (stmt);
|
||||
if (name && TREE_CODE (name) == SSA_NAME)
|
||||
bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (name));
|
||||
bitmap_set_bit (exprs_maybe_dce, SSA_NAME_VERSION (name));
|
||||
}
|
||||
if (dump_file && (dump_flags & TDF_FOLDING))
|
||||
{
|
||||
|
@ -867,10 +878,10 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
|
|||
|
||||
/* If there was a statement to move, move it to right before
|
||||
the original conditional. */
|
||||
move_stmt (stmt_to_move, &gsi, inserted_exprs);
|
||||
move_stmt (stmt_to_move_alt, &gsi, inserted_exprs);
|
||||
move_stmt (stmt_to_move, &gsi, exprs_maybe_dce);
|
||||
move_stmt (stmt_to_move_alt, &gsi, exprs_maybe_dce);
|
||||
|
||||
replace_phi_edge_with_variable (cond_bb, e1, phi, result, inserted_exprs);
|
||||
replace_phi_edge_with_variable (cond_bb, e1, phi, result, exprs_maybe_dce);
|
||||
|
||||
/* Add Statistic here even though replace_phi_edge_with_variable already
|
||||
does it as we want to be able to count when match-simplify happens vs
|
||||
|
|
Loading…
Add table
Reference in a new issue