Commit 3f9b5ffb by Jeff Law Committed by Jeff Law

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
parent b06479fd
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> 2015-02-11 Jan Hubicka <hubicka@ucw.cz>
* ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing * ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
......
...@@ -6291,7 +6291,15 @@ prune_ready_list (state_t temp_state, bool first_cycle_insn_p, ...@@ -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) if (SCHED_GROUP_P (insn) && cost > min_cost_group)
min_cost_group = cost; min_cost_group = cost;
ready_remove (&ready, i); 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) if (i + 1 < n)
break; break;
} }
......
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> 2015-02-11 Marek Polacek <polacek@redhat.com>
* g++.dg/ubsan/shift-1.C: New test. * g++.dg/ubsan/shift-1.C: New test.
......
/* { 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment