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:
parent
b06479fd41
commit
3f9b5ffb41
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue