ifcvt.c (total_bb_rtx_cost): New function.
authorDavid Edelsohn <edelsohn@gnu.org>
Wed, 7 Jul 2004 21:35:44 +0000 (21:35 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Wed, 7 Jul 2004 21:35:44 +0000 (17:35 -0400)
        * ifcvt.c (total_bb_rtx_cost): New function.
        (find_if_case_1): Compare rtx_cost of basic block to cost of
        BRANCH_COST insns.
        (find_if_case_2): Same.

From-SVN: r84233

gcc/ChangeLog
gcc/ifcvt.c

index 7d5e7db4ac467c113c8f449daa30b0f01933995d..87b72f91f8b08820a698c3e4ecf762187dc8a86d 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-07  David Edelsohn  <edelsohn@gnu.org>
+
+       * ifcvt.c (total_bb_rtx_cost): New function.
+       (find_if_case_1): Compare rtx_cost of basic block to cost of
+       BRANCH_COST insns.
+       (find_if_case_2): Same.
+
 2004-07-07  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR target/10567
index 03efaba2ebbcb3eb5870a028661274142e571929..865fe1ed1a1b57f8a6a0026bb538b2540421af3b 100644 (file)
@@ -86,6 +86,7 @@ static bool life_data_ok;
 
 /* Forward references.  */
 static int count_bb_insns (basic_block);
+static int total_bb_rtx_cost (basic_block);
 static rtx first_active_insn (basic_block);
 static rtx last_active_insn (basic_block, int);
 static basic_block block_fallthru (basic_block);
@@ -160,6 +161,27 @@ count_bb_insns (basic_block bb)
   return count;
 }
 
+/* Count the total rtx_cost of non-jump active insns in BB.  */
+
+static int
+total_bb_rtx_cost (basic_block bb)
+{
+  int count = 0;
+  rtx insn = BB_HEAD (bb);
+
+  while (1)
+    {
+      if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == INSN)
+       count += rtx_cost (PATTERN (insn), 0);
+
+      if (insn == BB_END (bb))
+       break;
+      insn = NEXT_INSN (insn);
+    }
+
+  return count;
+}
+
 /* Return the first non-jump active insn in the basic block.  */
 
 static rtx
@@ -2883,7 +2905,7 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
             test_bb->index, then_bb->index);
 
   /* THEN is small.  */
-  if (count_bb_insns (then_bb) > BRANCH_COST)
+  if (total_bb_rtx_cost (then_bb) >= COSTS_N_INSNS (BRANCH_COST))
     return FALSE;
 
   /* Registers set are dead, or are predicable.  */
@@ -2974,7 +2996,7 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
             test_bb->index, else_bb->index);
 
   /* ELSE is small.  */
-  if (count_bb_insns (else_bb) > BRANCH_COST)
+  if (total_bb_rtx_cost (else_bb) >= COSTS_N_INSNS (BRANCH_COST))
     return FALSE;
 
   /* Registers set are dead, or are predicable.  */