Commit dda243de by Steven Bosscher Committed by Steven Bosscher

tree-ssa-pre.c (try_look_through_load): New function.

	* tree-ssa-pre.c (try_look_through_load): New function.
	(compute_avail): Use it to try to look through loads for some
	more useful expressions.

From-SVN: r103956
parent f5d1572a
2005-09-06 Steven Bosscher <stevenb@suse.de>
* tree-ssa-pre.c (try_look_through_load): New function.
(compute_avail): Use it to try to look through loads for some
more useful expressions.
2005-09-06 Saurabh Verma <saurabh.verma@codito.com> 2005-09-06 Saurabh Verma <saurabh.verma@codito.com>
* simplify-rtx.c (simplify_binary_operation_1): Correct the * simplify-rtx.c (simplify_binary_operation_1): Correct the
......
...@@ -2136,6 +2136,75 @@ can_value_number_call (tree stmt) ...@@ -2136,6 +2136,75 @@ can_value_number_call (tree stmt)
return false; return false;
} }
/* Given a statement STMT and its right hand side which is a load, try
to look for the expression stored in the location for the load, and
return true if a useful equivalence was recorded for LHS. */
static bool
try_look_through_load (tree lhs, tree mem_ref, tree stmt, basic_block block)
{
tree store_stmt = NULL;
tree rhs;
ssa_op_iter i;
tree vuse;
FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, i, SSA_OP_VIRTUAL_USES)
{
tree def_stmt;
gcc_assert (TREE_CODE (vuse) == SSA_NAME);
def_stmt = SSA_NAME_DEF_STMT (vuse);
/* If there is no useful statement for this VUSE, we'll not find a
useful expression to return either. Likewise, if there is a
statement but it is not a simple assignment or it has virtual
uses, we can stop right here. Note that this means we do
not look through PHI nodes, which is intentional. */
if (!def_stmt
|| TREE_CODE (def_stmt) != MODIFY_EXPR
|| !ZERO_SSA_OPERANDS (def_stmt, SSA_OP_VIRTUAL_USES))
return false;
/* If this is not the same statement as one we have looked at for
another VUSE of STMT already, we have two statements producing
something that reaches our STMT. */
if (store_stmt && store_stmt != def_stmt)
return false;
else
{
/* Is this a store to the exact same location as the one we are
loading from in STMT? */
if (!operand_equal_p (TREE_OPERAND (def_stmt, 0), mem_ref, 0))
return false;
/* Otherwise remember this statement and see if all other VUSEs
come from the same statement. */
store_stmt = def_stmt;
}
}
/* Alright then, we have visited all VUSEs of STMT and we've determined
that all of them come from the same statement STORE_STMT. See if there
is a useful expression we can deduce from STORE_STMT. */
rhs = TREE_OPERAND (store_stmt, 1);
if (TREE_CODE (rhs) == SSA_NAME
|| is_gimple_min_invariant (rhs)
|| TREE_CODE (rhs) == ADDR_EXPR
|| TREE_INVARIANT (rhs))
{
/* Yay! Compute a value number for the RHS of the statement and
add its value to the AVAIL_OUT set for the block. Add the LHS
to TMP_GEN. */
add_to_sets (lhs, rhs, store_stmt, TMP_GEN (block), AVAIL_OUT (block));
if (TREE_CODE (rhs) == SSA_NAME
&& !is_undefined_value (rhs))
value_insert_into_set (EXP_GEN (block), rhs);
return true;
}
return false;
}
/* Compute the AVAIL set for all basic blocks. /* Compute the AVAIL set for all basic blocks.
This function performs value numbering of the statements in each basic This function performs value numbering of the statements in each basic
...@@ -2226,6 +2295,12 @@ compute_avail (void) ...@@ -2226,6 +2295,12 @@ compute_avail (void)
tree lhs = TREE_OPERAND (stmt, 0); tree lhs = TREE_OPERAND (stmt, 0);
tree rhs = TREE_OPERAND (stmt, 1); tree rhs = TREE_OPERAND (stmt, 1);
/* Try to look through loads. */
if (TREE_CODE (lhs) == SSA_NAME
&& !ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_USES)
&& try_look_through_load (lhs, rhs, stmt, block))
continue;
STRIP_USELESS_TYPE_CONVERSION (rhs); STRIP_USELESS_TYPE_CONVERSION (rhs);
if (UNARY_CLASS_P (rhs) if (UNARY_CLASS_P (rhs)
|| BINARY_CLASS_P (rhs) || BINARY_CLASS_P (rhs)
......
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