(jump_optimize): Use emit_store_flag even if branches are cheap, if
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 21 Oct 1996 11:39:13 +0000 (07:39 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 21 Oct 1996 11:39:13 +0000 (07:39 -0400)
the store is even cheaper.

From-SVN: r12982

gcc/jump.c

index b6d0bdcbe06670f0bedb94d75f4dbd917c20b4cf..afa7e153b5b2ed4a26490fb44c8e7c61693d7e76 100644 (file)
@@ -1,5 +1,5 @@
 /* Optimize jump instructions, for GNU compiler.
-   Copyright (C) 1987, 88, 89, 91-95, 1996 Free Software Foundation, Inc.b
+   Copyright (C) 1987, 88, 89, 91-95, 1996 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1165,13 +1165,9 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
                 We could handle BLKmode if (1) emit_store_flag could
                 and (2) we could find the size reliably.  */
              && GET_MODE (XEXP (temp4, 0)) != BLKmode
-             /* No point in doing any of this if branches are cheap or we
-                don't have conditional moves.  */
-             && (BRANCH_COST >= 2
-#ifdef HAVE_conditional_move
-                 || 1
-#endif
-                 )
+             /* Even if branches are cheap, the store_flag optimization
+                can win when the operation to be performed can be
+                expressed directly.  */
 #ifdef HAVE_cc0
              /* If the previous insn sets CC0 and something else, we can't
                 do this since we are going to delete that insn.  */
@@ -1282,8 +1278,19 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
                     can reverse the condition.  See if (3) applies possibly
                     by reversing the condition.  Prefer reversing to (4) when
                     branches are very expensive.  */
-                 && ((reversep = 0, temp2 == const0_rtx)
-                     || (temp3 == const0_rtx
+                 && (((BRANCH_COST >= 2
+                       || STORE_FLAG_VALUE == -1
+                       || (STORE_FLAG_VALUE == 1
+                        /* Check that the mask is a power of two,
+                           so that it can probably be generated
+                           with a shift.  */
+                           && exact_log2 (INTVAL (temp3)) >= 0))
+                      && (reversep = 0, temp2 == const0_rtx))
+                     || ((BRANCH_COST >= 2
+                          || STORE_FLAG_VALUE == -1
+                          || (STORE_FLAG_VALUE == 1
+                              && exact_log2 (INTVAL (temp2)) >= 0))
+                         && temp3 == const0_rtx
                          && (reversep = can_reverse_comparison_p (temp4, insn)))
                      || (BRANCH_COST >= 2
                          && GET_CODE (temp2) == CONST_INT