aboutsummaryrefslogtreecommitdiff
path: root/gcc/modulo-sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/modulo-sched.c')
-rw-r--r--gcc/modulo-sched.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c
index 3352e20..93f5b9a 100644
--- a/gcc/modulo-sched.c
+++ b/gcc/modulo-sched.c
@@ -868,6 +868,10 @@ canon_loop (struct loop *loop)
}
}
+/* Probability in % that the sms-ed loop rolls enough so that optimized
+ version may be entered. Just a guess. */
+#define PROB_SMS_ENOUGH_ITERATIONS 80
+
/* Main entry point, perform SMS scheduling on the loops of the function
that consist of single basic blocks. */
static void
@@ -882,7 +886,7 @@ sms_schedule (void)
partial_schedule_ptr ps;
struct df *df;
basic_block bb = NULL;
- struct loop *loop, *nloop;
+ struct loop *loop;
basic_block condition_bb = NULL;
edge latch_edge;
gcov_type trip_count = 0;
@@ -1181,8 +1185,12 @@ sms_schedule (void)
{
rtx comp_rtx = gen_rtx_fmt_ee (GT, VOIDmode, count_reg,
GEN_INT(stage_count));
+ unsigned prob = (PROB_SMS_ENOUGH_ITERATIONS
+ * REG_BR_PROB_BASE) / 100;
- nloop = loop_version (loop, comp_rtx, &condition_bb, true);
+ loop_version (loop, comp_rtx, &condition_bb,
+ prob, prob, REG_BR_PROB_BASE - prob,
+ true);
}
/* Set new iteration count of loop kernel. */