From 9677695f0f925e9a1a63365d125cc81c4eadbf06 Mon Sep 17 00:00:00 2001 From: kazu Date: Mon, 21 Feb 2005 18:38:05 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95339 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/tree-cfg.c | 44 ++++++++++++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37cf2fbec92..e18b08a6271 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-02-21 Kazu Hirata + + * 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 * cfganal.c (find_unreachable_blocks): Manually CSE load of diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 680262c79a4..9e87dbfccb0 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -440,6 +440,29 @@ create_bb (void *h, void *e, basic_block after) 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 @@ -478,6 +501,9 @@ make_edges (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 (); } @@ -2198,14 +2224,7 @@ find_taken_edge (basic_block bb, tree val) 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) @@ -2237,12 +2256,12 @@ find_taken_edge_cond_expr (basic_block bb, tree val) 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. */ @@ -2253,9 +2272,6 @@ find_taken_edge_switch_expr (basic_block bb, tree val) 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)); -- 2.11.0