+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>
* cfganal.c (find_unreachable_blocks): Manually CSE load of
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. */
static void
builder inserted for completeness. */
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. */
cleanup_tree_cfg ();
}
gcc_assert (is_ctrl_stmt (stmt));
gcc_assert (val);
- /* If VAL is a predicate of the form N RELOP N, where N is an
- 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))
+ if (TREE_CODE (val) != INTEGER_CST)
return NULL;
if (TREE_CODE (stmt) == COND_EXPR)
return true_edge;
else if (integer_zerop (val))
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
NULL if any edge may be taken. */
basic_block dest_bb;
edge e;
- if (TREE_CODE (val) != INTEGER_CST)
- return NULL;
-
switch_expr = last_stmt (bb);
taken_case = find_case_label_for_value (switch_expr, val);
dest_bb = label_to_block (CASE_LABEL (taken_case));