Remove forward_propagate_into_cond
This is a first cleanup opportunity from the COND_EXPR gimplification which allows us to remove now redundant forward_propagate_into_cond. 2022-05-23 Richard Biener <rguenther@suse.de> * tree-ssa-forwprop.cc (forward_propagate_into_cond): Remove. (pass_forwprop::execute): Do not propagate into COND_EXPR conditions.
This commit is contained in:
parent
19dd439389
commit
0236ea984c
@ -511,9 +511,7 @@ forward_propagate_into_comparison (gimple_stmt_iterator *gsi)
|
||||
/* Propagate from the ssa name definition statements of COND_EXPR
|
||||
in GIMPLE_COND statement STMT into the conditional if that simplifies it.
|
||||
Returns zero if no statement was changed, one if there were
|
||||
changes and two if cfg_cleanup needs to run.
|
||||
|
||||
This must be kept in sync with forward_propagate_into_cond. */
|
||||
changes and two if cfg_cleanup needs to run. */
|
||||
|
||||
static int
|
||||
forward_propagate_into_gimple_cond (gcond *stmt)
|
||||
@ -573,70 +571,6 @@ forward_propagate_into_gimple_cond (gcond *stmt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Propagate from the ssa name definition statements of COND_EXPR
|
||||
in the rhs of statement STMT into the conditional if that simplifies it.
|
||||
Returns true zero if the stmt was changed. */
|
||||
|
||||
static bool
|
||||
forward_propagate_into_cond (gimple_stmt_iterator *gsi_p)
|
||||
{
|
||||
gimple *stmt = gsi_stmt (*gsi_p);
|
||||
tree tmp = NULL_TREE;
|
||||
tree cond = gimple_assign_rhs1 (stmt);
|
||||
enum tree_code code = gimple_assign_rhs_code (stmt);
|
||||
|
||||
/* We can do tree combining on SSA_NAME and comparison expressions. */
|
||||
if (COMPARISON_CLASS_P (cond))
|
||||
tmp = forward_propagate_into_comparison_1 (stmt, TREE_CODE (cond),
|
||||
TREE_TYPE (cond),
|
||||
TREE_OPERAND (cond, 0),
|
||||
TREE_OPERAND (cond, 1));
|
||||
else if (TREE_CODE (cond) == SSA_NAME)
|
||||
{
|
||||
enum tree_code def_code;
|
||||
tree name = cond;
|
||||
gimple *def_stmt = get_prop_source_stmt (name, true, NULL);
|
||||
if (!def_stmt || !can_propagate_from (def_stmt))
|
||||
return 0;
|
||||
|
||||
def_code = gimple_assign_rhs_code (def_stmt);
|
||||
if (TREE_CODE_CLASS (def_code) == tcc_comparison)
|
||||
tmp = fold_build2_loc (gimple_location (def_stmt),
|
||||
def_code,
|
||||
TREE_TYPE (cond),
|
||||
gimple_assign_rhs1 (def_stmt),
|
||||
gimple_assign_rhs2 (def_stmt));
|
||||
}
|
||||
|
||||
if (tmp
|
||||
&& is_gimple_val (tmp))
|
||||
{
|
||||
if (dump_file)
|
||||
{
|
||||
fprintf (dump_file, " Replaced '");
|
||||
print_generic_expr (dump_file, cond);
|
||||
fprintf (dump_file, "' with '");
|
||||
print_generic_expr (dump_file, tmp);
|
||||
fprintf (dump_file, "'\n");
|
||||
}
|
||||
|
||||
if ((code == VEC_COND_EXPR) ? integer_all_onesp (tmp)
|
||||
: integer_onep (tmp))
|
||||
gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs2 (stmt));
|
||||
else if (integer_zerop (tmp))
|
||||
gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs3 (stmt));
|
||||
else
|
||||
gimple_assign_set_rhs1 (stmt, unshare_expr (tmp));
|
||||
stmt = gsi_stmt (*gsi_p);
|
||||
update_stmt (stmt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We've just substituted an ADDR_EXPR into stmt. Update all the
|
||||
relevant data structures to match. */
|
||||
|
||||
@ -3720,16 +3654,7 @@ pass_forwprop::execute (function *fun)
|
||||
tree rhs1 = gimple_assign_rhs1 (stmt);
|
||||
enum tree_code code = gimple_assign_rhs_code (stmt);
|
||||
|
||||
if (code == COND_EXPR)
|
||||
{
|
||||
/* In this case the entire COND_EXPR is in rhs1. */
|
||||
if (forward_propagate_into_cond (&gsi))
|
||||
{
|
||||
changed = true;
|
||||
stmt = gsi_stmt (gsi);
|
||||
}
|
||||
}
|
||||
else if (TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
{
|
||||
int did_something;
|
||||
did_something = forward_propagate_into_comparison (&gsi);
|
||||
|
Loading…
Reference in New Issue
Block a user