tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code to simplify SWITCH_EXPR_CODE moved from here to ...

* tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code
	to simplify SWITCH_EXPR_CODE moved from here to ...
	* tree-ssa-forwprop.c (simplify_switch_expr): Here.
	(tree-ssa-forward_propagate_single_use_vars): Call
	simplify_switch_expr when appropriate.

From-SVN: r108738
This commit is contained in:
Jeff Law 2005-12-18 00:23:08 -07:00 committed by Jeff Law
parent a7ceba73e5
commit 6b62dff819
3 changed files with 68 additions and 65 deletions

View File

@ -1,3 +1,11 @@
2005-12-18 Jeff Law <law@redhat.com>
* tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code
to simplify SWITCH_EXPR_CODE moved from here to ...
* tree-ssa-forwprop.c (simplify_switch_expr): Here.
(tree-ssa-forward_propagate_single_use_vars): Call
simplify_switch_expr when appropriate.
2005-12-17 Andrew Pinski <pinskia@physics.uc.edu>
* doc/objc.texi (Type encoding): Add documentation about encoding

View File

@ -274,7 +274,6 @@ static void record_cond (tree, tree);
static void record_const_or_copy (tree, tree);
static void record_equality (tree, tree);
static tree simplify_cond_and_lookup_avail_expr (tree, stmt_ann_t, int);
static tree simplify_switch_and_lookup_avail_expr (tree, int);
static tree find_equivalent_equality_comparison (tree);
static void record_range (tree, basic_block);
static bool extract_range_from_cond (tree, tree *, tree *, int *);
@ -2120,67 +2119,6 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
return 0;
}
/* STMT is a SWITCH_EXPR for which we could not trivially determine its
result. This routine attempts to find equivalent forms of the
condition which we may be able to optimize better. */
static tree
simplify_switch_and_lookup_avail_expr (tree stmt, int insert)
{
tree cond = SWITCH_COND (stmt);
tree def, to, ti;
/* The optimization that we really care about is removing unnecessary
casts. That will let us do much better in propagating the inferred
constant at the switch target. */
if (TREE_CODE (cond) == SSA_NAME)
{
def = SSA_NAME_DEF_STMT (cond);
if (TREE_CODE (def) == MODIFY_EXPR)
{
def = TREE_OPERAND (def, 1);
if (TREE_CODE (def) == NOP_EXPR)
{
int need_precision;
bool fail;
def = TREE_OPERAND (def, 0);
#ifdef ENABLE_CHECKING
/* ??? Why was Jeff testing this? We are gimple... */
gcc_assert (is_gimple_val (def));
#endif
to = TREE_TYPE (cond);
ti = TREE_TYPE (def);
/* If we have an extension that preserves value, then we
can copy the source value into the switch. */
need_precision = TYPE_PRECISION (ti);
fail = false;
if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti))
fail = true;
else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti))
need_precision += 1;
if (TYPE_PRECISION (to) < need_precision)
fail = true;
if (!fail)
{
SWITCH_COND (stmt) = def;
mark_stmt_modified (stmt);
return lookup_avail_expr (stmt, insert);
}
}
}
}
return 0;
}
/* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
known value for that SSA_NAME (or NULL if no value is known).
@ -2473,9 +2411,6 @@ eliminate_redundant_computations (tree stmt, stmt_ann_t ann)
the hash table, simplify the condition and try again. */
if (! cached_lhs && TREE_CODE (stmt) == COND_EXPR)
cached_lhs = simplify_cond_and_lookup_avail_expr (stmt, ann, insert);
/* Similarly for a SWITCH_EXPR. */
else if (!cached_lhs && TREE_CODE (stmt) == SWITCH_EXPR)
cached_lhs = simplify_switch_and_lookup_avail_expr (stmt, insert);
opt_stats.num_exprs_considered++;

View File

@ -739,6 +739,61 @@ simplify_not_neg_expr (tree stmt)
}
}
/* STMT is a SWITCH_EXPR for which we attempt to find equivalent forms of
the condition which we may be able to optimize better. */
static void
simplify_switch_expr (tree stmt)
{
tree cond = SWITCH_COND (stmt);
tree def, to, ti;
/* The optimization that we really care about is removing unnecessary
casts. That will let us do much better in propagating the inferred
constant at the switch target. */
if (TREE_CODE (cond) == SSA_NAME)
{
def = SSA_NAME_DEF_STMT (cond);
if (TREE_CODE (def) == MODIFY_EXPR)
{
def = TREE_OPERAND (def, 1);
if (TREE_CODE (def) == NOP_EXPR)
{
int need_precision;
bool fail;
def = TREE_OPERAND (def, 0);
#ifdef ENABLE_CHECKING
/* ??? Why was Jeff testing this? We are gimple... */
gcc_assert (is_gimple_val (def));
#endif
to = TREE_TYPE (cond);
ti = TREE_TYPE (def);
/* If we have an extension that preserves value, then we
can copy the source value into the switch. */
need_precision = TYPE_PRECISION (ti);
fail = false;
if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti))
fail = true;
else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti))
need_precision += 1;
if (TYPE_PRECISION (to) < need_precision)
fail = true;
if (!fail)
{
SWITCH_COND (stmt) = def;
update_stmt (stmt);
}
}
}
}
}
/* Main entry point for the forward propagation optimizer. */
static void
@ -788,6 +843,11 @@ tree_ssa_forward_propagate_single_use_vars (void)
else
bsi_next (&bsi);
}
else if (TREE_CODE (stmt) == SWITCH_EXPR)
{
simplify_switch_expr (stmt);
bsi_next (&bsi);
}
else if (TREE_CODE (stmt) == COND_EXPR)
{
forward_propagate_into_cond (stmt);