tree-cfg.c (find_taken_edge): Statically compute the truth value of a predicate compa...
authorDiego Novillo <dnovillo@redhat.com>
Mon, 12 Jul 2004 15:38:25 +0000 (15:38 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Mon, 12 Jul 2004 15:38:25 +0000 (11:38 -0400)
* tree-cfg.c (find_taken_edge): Statically compute the truth
value of a predicate comparing an SSA_NAME to itself.

From-SVN: r84561

gcc/ChangeLog
gcc/tree-cfg.c

index e3d670dece480bcbd6199413ea80f33a2a47c1a2..9580f3d0a6d7ad6f8da53cc67cabaa0932f7fbc5 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-12  Diego Novillo  <dnovillo@redhat.com>
+
+       * tree-cfg.c (find_taken_edge): Statically compute the truth
+       value of a predicate comparing an SSA_NAME to itself.
+
 2004-07-12  Roger Sayle  <roger@eyesopen.com>
 
        * config/rs6000/rs6000.c (rs6000_rtx_costs): Indicate that the
index bd2ec9af808e953bfd4767020a8c61e19fc1866b..6207fd31915c712676509f8791c7d481c9552fe2 100644 (file)
@@ -1991,9 +1991,9 @@ cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
 }
 
 
-/* Given a control block BB and a constant value VAL, return the edge that
-   will be taken out of the block.  If VAL does not match a unique edge,
-   NULL is returned.  */
+/* Given a control block BB and a predicate VAL, return the edge that
+   will be taken out of the block.  If VAL does not match a unique
+   edge, NULL is returned. */
 
 edge
 find_taken_edge (basic_block bb, tree val)
@@ -2007,6 +2007,24 @@ find_taken_edge (basic_block bb, tree val)
     abort ();
 #endif
 
+  /* If VAL is a predicate of the form N RELOP N, where N is an
+     SSA_NAME, we can always determine its truth value (except when
+     doing floating point comparisons that may involve NaNs).  */
+  if (val
+      && TREE_CODE_CLASS (TREE_CODE (val)) == '<'
+      && TREE_OPERAND (val, 0) == TREE_OPERAND (val, 1)
+      && TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME
+      && (TREE_CODE (TREE_TYPE (TREE_OPERAND (val, 0))) != REAL_TYPE
+         || !HONOR_NANS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (val, 0))))))
+    {
+      enum tree_code code = TREE_CODE (val);
+
+      if (code == EQ_EXPR || code == LE_EXPR || code == GE_EXPR)
+       val = boolean_true_node;
+      else if (code == LT_EXPR || code == GT_EXPR || code == NE_EXPR)
+       val = boolean_false_node;
+    }
+
   /* If VAL is not a constant, we can't determine which edge might
      be taken.  */
   if (val == NULL || !really_constant_p (val))