Commit fca01525 by Kazu Hirata Committed by Kazu Hirata

tree-cfg.c (fold_cond_expr_cond): New.

	* tree-cfg.c (fold_cond_expr_cond): New.
	(make_edges): Call fold_cond_expr_cond.
	(find_taken_edge): Accept nothing but INTEGER_CST.
	(find_taken_edge_cond_expr): Reject INTEGER_CST other than 0
	and 1.
	(find_taken_edge_switch_expr): Remove a check for INTEGER_CST.

From-SVN: r95339
parent 92c91cf7
2005-02-21 Kazu Hirata <kazu@cs.umass.edu>
* tree-cfg.c (fold_cond_expr_cond): New.
(make_edges): Call fold_cond_expr_cond.
(find_taken_edge): Accept nothing but INTEGER_CST.
(find_taken_edge_cond_expr): Reject INTEGER_CST other than 0
and 1.
(find_taken_edge_switch_expr): Remove a check for INTEGER_CST.
2005-02-21 Jeff Law <law@redhat.com> 2005-02-21 Jeff Law <law@redhat.com>
* cfganal.c (find_unreachable_blocks): Manually CSE load of * cfganal.c (find_unreachable_blocks): Manually CSE load of
......
...@@ -440,6 +440,29 @@ create_bb (void *h, void *e, basic_block after) ...@@ -440,6 +440,29 @@ create_bb (void *h, void *e, basic_block after)
Edge creation Edge creation
---------------------------------------------------------------------------*/ ---------------------------------------------------------------------------*/
/* Fold COND_EXPR_COND of each COND_EXPR. */
static void
fold_cond_expr_cond (void)
{
basic_block bb;
FOR_EACH_BB (bb)
{
tree stmt = last_stmt (bb);
if (stmt
&& TREE_CODE (stmt) == COND_EXPR)
{
tree cond = fold (COND_EXPR_COND (stmt));
if (integer_zerop (cond))
COND_EXPR_COND (stmt) = integer_zero_node;
else if (integer_onep (cond))
COND_EXPR_COND (stmt) = integer_one_node;
}
}
}
/* Join all the blocks in the flowgraph. */ /* Join all the blocks in the flowgraph. */
static void static void
...@@ -478,6 +501,9 @@ make_edges (void) ...@@ -478,6 +501,9 @@ make_edges (void)
builder inserted for completeness. */ builder inserted for completeness. */
remove_fake_exit_edges (); remove_fake_exit_edges ();
/* Fold COND_EXPR_COND of each COND_EXPR. */
fold_cond_expr_cond ();
/* Clean up the graph and warn for unreachable code. */ /* Clean up the graph and warn for unreachable code. */
cleanup_tree_cfg (); cleanup_tree_cfg ();
} }
...@@ -2198,14 +2224,7 @@ find_taken_edge (basic_block bb, tree val) ...@@ -2198,14 +2224,7 @@ find_taken_edge (basic_block bb, tree val)
gcc_assert (is_ctrl_stmt (stmt)); gcc_assert (is_ctrl_stmt (stmt));
gcc_assert (val); gcc_assert (val);
/* If VAL is a predicate of the form N RELOP N, where N is an if (TREE_CODE (val) != INTEGER_CST)
SSA_NAME, we can usually determine its truth value. */
if (COMPARISON_CLASS_P (val))
val = fold (val);
/* If VAL is not a constant, we can't determine which edge might
be taken. */
if (!really_constant_p (val))
return NULL; return NULL;
if (TREE_CODE (stmt) == COND_EXPR) if (TREE_CODE (stmt) == COND_EXPR)
...@@ -2237,12 +2256,12 @@ find_taken_edge_cond_expr (basic_block bb, tree val) ...@@ -2237,12 +2256,12 @@ find_taken_edge_cond_expr (basic_block bb, tree val)
return true_edge; return true_edge;
else if (integer_zerop (val)) else if (integer_zerop (val))
return false_edge; return false_edge;
else
return NULL; gcc_unreachable ();
} }
/* Given a constant value VAL and the entry block BB to a SWITCH_EXPR /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
statement, determine which edge will be taken out of the block. Return statement, determine which edge will be taken out of the block. Return
NULL if any edge may be taken. */ NULL if any edge may be taken. */
...@@ -2253,9 +2272,6 @@ find_taken_edge_switch_expr (basic_block bb, tree val) ...@@ -2253,9 +2272,6 @@ find_taken_edge_switch_expr (basic_block bb, tree val)
basic_block dest_bb; basic_block dest_bb;
edge e; edge e;
if (TREE_CODE (val) != INTEGER_CST)
return NULL;
switch_expr = last_stmt (bb); switch_expr = last_stmt (bb);
taken_case = find_case_label_for_value (switch_expr, val); taken_case = find_case_label_for_value (switch_expr, val);
dest_bb = label_to_block (CASE_LABEL (taken_case)); dest_bb = label_to_block (CASE_LABEL (taken_case));
......
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