ifcvt.c (ifcvt_after_combine): New static variable.
authorBin Cheng <bin.cheng@arm.com>
Sat, 13 Jul 2013 08:51:18 +0000 (08:51 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Sat, 13 Jul 2013 08:51:18 +0000 (08:51 +0000)
* ifcvt.c (ifcvt_after_combine): New static variable.
(cheap_bb_rtx_cost_p): Set scale to REG_BR_PROB_BASE when optimizing
for size.
(if_convert): New parameter after_combine.  Set ifcvt_after_combine.
(rest_of_handle_if_conversion, rest_of_handle_if_after_combine,
rest_of_handle_if_after_reload): Pass new argument for if_convert.

From-SVN: r200936

gcc/ChangeLog
gcc/ifcvt.c

index 24c974712a7569c2d1f318c73436416ea333eb82..61082beb3ee386bb4f7c004180d45900c4fb15e2 100644 (file)
@@ -1,3 +1,12 @@
+2013-07-13  Bin Cheng  <bin.cheng@arm.com>
+
+       * ifcvt.c (ifcvt_after_combine): New static variable.
+       (cheap_bb_rtx_cost_p): Set scale to REG_BR_PROB_BASE when optimizing
+       for size.
+       (if_convert): New parameter after_combine.  Set ifcvt_after_combine.
+       (rest_of_handle_if_conversion, rest_of_handle_if_after_combine,
+       rest_of_handle_if_after_reload): Pass new argument for if_convert.
+
 2013-07-12  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * config/mips/mips.c (mips_expand_call): Remove empty statement.
index c6c2aeb4b87326bcc9c613e73afc3aaa84cec31f..b149d54c793bcb7b2e765c193982ccf715cd287a 100644 (file)
@@ -67,6 +67,9 @@
 
 #define NULL_BLOCK     ((basic_block) NULL)
 
+/* True if after combine pass.  */
+static bool ifcvt_after_combine;
+
 /* # of IF-THEN or IF-THEN-ELSE blocks we looked at  */
 static int num_possible_if_blocks;
 
@@ -141,11 +144,24 @@ cheap_bb_rtx_cost_p (const_basic_block bb, int scale, int max_cost)
   rtx insn = BB_HEAD (bb);
   bool speed = optimize_bb_for_speed_p (bb);
 
+  /* Set scale to REG_BR_PROB_BASE to void the identical scaling
+     applied to insn_rtx_cost when optimizing for size.  Only do
+     this after combine because if-conversion might interfere with
+     passes before combine.
+
+     Use optimize_function_for_speed_p instead of the pre-defined
+     variable speed to make sure it is set to same value for all
+     basic blocks in one if-conversion transformation.  */
+  if (!optimize_function_for_speed_p (cfun) && ifcvt_after_combine)
+    scale = REG_BR_PROB_BASE;
   /* Our branch probability/scaling factors are just estimates and don't
      account for cases where we can get speculation for free and other
      secondary benefits.  So we fudge the scale factor to make speculating
-     appear a little more profitable.  */
-  scale += REG_BR_PROB_BASE / 8;
+     appear a little more profitable when optimizing for performance.  */
+  else
+    scale += REG_BR_PROB_BASE / 8;
+
+
   max_cost *= scale;
 
   while (1)
@@ -4337,10 +4353,11 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
   return FALSE;
 }
 \f
-/* Main entry point for all if-conversion.  */
+/* Main entry point for all if-conversion.  AFTER_COMBINE is true if
+   we are after combine pass.  */
 
 static void
-if_convert (void)
+if_convert (bool after_combine)
 {
   basic_block bb;
   int pass;
@@ -4351,6 +4368,8 @@ if_convert (void)
       df_live_set_all_dirty ();
     }
 
+  /* Record whether we are after combine pass.  */
+  ifcvt_after_combine = after_combine;
   num_possible_if_blocks = 0;
   num_updated_if_blocks = 0;
   num_true_changes = 0;
@@ -4454,7 +4473,7 @@ rest_of_handle_if_conversion (void)
          dump_flow_info (dump_file, dump_flags);
        }
       cleanup_cfg (CLEANUP_EXPENSIVE);
-      if_convert ();
+      if_convert (false);
     }
 
   cleanup_cfg (0);
@@ -4495,7 +4514,7 @@ gate_handle_if_after_combine (void)
 static unsigned int
 rest_of_handle_if_after_combine (void)
 {
-  if_convert ();
+  if_convert (true);
   return 0;
 }
 
@@ -4530,7 +4549,7 @@ gate_handle_if_after_reload (void)
 static unsigned int
 rest_of_handle_if_after_reload (void)
 {
-  if_convert ();
+  if_convert (true);
   return 0;
 }