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
This commit is contained in:
Jeff Law 2015-02-11 16:29:11 -07:00 committed by Jeff Law
parent b06479fd41
commit 3f9b5ffb41
4 changed files with 66 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2015-02-11 Jeff Law <law@redhat.com>
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.
2015-02-11 Jan Hubicka <hubicka@ucw.cz>
* ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing

View File

@ -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;
}

View File

@ -1,3 +1,8 @@
2015-02-11 Jeff Law <law@redhat.com>
PR target/63347
* gcc.target/m68k/pr63347.c: New test.
2015-02-11 Marek Polacek <polacek@redhat.com>
* g++.dg/ubsan/shift-1.C: New test.

View File

@ -0,0 +1,46 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mcpu=5208" } */
#include <stdlib.h>
void __attribute__ ((noinline))
oof()
{
asm volatile ("" ::: "memory");
}
int print_info(unsigned int *ip_addr)
{
int invalid = 0;
if (ip_addr) {
unsigned int haddr = *ip_addr;
oof("stuff");
if (0x0 == haddr) {
invalid = 1;
}
oof("stuff2");
} else {
invalid = 1;
}
return invalid;
}
int main(int argc, char *argv[])
{
unsigned int myaddr;
int ret;
myaddr = 0x0;
ret = print_info(&myaddr);
if (!ret)
abort ();
myaddr = 0x01020304;
ret = print_info(&myaddr);
if (ret)
abort ();
exit (0);
}