OSDN Git Service

* tree-cfg.c (fold_cond_expr_cond): New.
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Feb 2005 18:38:05 +0000 (18:38 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Feb 2005 18:38:05 +0000 (18:38 +0000)
(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
gcc/tree-cfg.c

index 37cf2fb..e18b08a 100644 (file)
@@ -1,3 +1,12 @@
+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
index 680262c..9e87dbf 100644 (file)
@@ -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));