From 3f9b5ffb41e5967c1fc4cfcc3f181a5c6f20ab85 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 11 Feb 2015 16:29:11 -0700 Subject: re PR target/63347 (m68k misoptimisation with -fschedule-insns) PR target/63347 * haifa-sched.c (prune_ready_list): If we have a SCHED_GROUP_P insn that needs to be queued, just queue it for a single cycle. PR target/63347 * gcc.target/m68k/pr63347.c: New test. From-SVN: r220632 --- gcc/haifa-sched.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'gcc/haifa-sched.c') diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 75d2421..64c8c9c1 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -6291,7 +6291,15 @@ prune_ready_list (state_t temp_state, bool first_cycle_insn_p, if (SCHED_GROUP_P (insn) && cost > min_cost_group) min_cost_group = cost; ready_remove (&ready, i); - queue_insn (insn, cost, reason); + /* Normally we'd want to queue INSN for COST cycles. However, + if SCHED_GROUP_P is set, then we must ensure that nothing + else comes between INSN and its predecessor. If there is + some other insn ready to fire on the next cycle, then that + invariant would be broken. + + So when SCHED_GROUP_P is set, just queue this insn for a + single cycle. */ + queue_insn (insn, SCHED_GROUP_P (insn) ? 1 : cost, reason); if (i + 1 < n) break; } -- cgit v1.1