aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index cade864f191..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));
@@ -5079,7 +5095,7 @@ tree_duplicate_sese_region (edge entry, edge exit,
free (region_copy);
unmark_all_for_rewrite ();
- BITMAP_XFREE (definitions);
+ BITMAP_FREE (definitions);
return true;
}