aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2013-07-13 08:51:18 +0000
committerBin Cheng <amker@gcc.gnu.org>2013-07-13 08:51:18 +0000
commite43257e81709a7c2f3d6f08623c1e6331b71a92a (patch)
tree4b0211ebdea0bf8fbcfb0abce7580c5407e24e47 /gcc
parent937060bda42fba1ea592d2314ab3ec136faa1da0 (diff)
downloadgcc-e43257e81709a7c2f3d6f08623c1e6331b71a92a.zip
gcc-e43257e81709a7c2f3d6f08623c1e6331b71a92a.tar.gz
gcc-e43257e81709a7c2f3d6f08623c1e6331b71a92a.tar.bz2
ifcvt.c (ifcvt_after_combine): New static variable.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ifcvt.c33
2 files changed, 35 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 24c9747..61082be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index c6c2aeb..b149d54 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -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;
}
-/* 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;
}