Commit 07ad5438 by Georg-Johann Lay Committed by Georg-Johann Lay

re PR rtl-optimization/51374 ([avr] insn combine reorders volatile memory accesses)

gcc/
	PR rtl-optimization/51374
	* combine.c (can_combine_p): Don't allow volatile_refs_p insns
	to cross other volatile_refs_p insns.

gcc/testsuite/
	PR rtl-optimization/51374
	* testsuite/gcc.target/avr/torture/pr51374-1.c: New.

From-SVN: r183796
parent 76a3962f
2012-02-01 Georg-Johann Lay <avr@gjlay.de>
PR rtl-optimization/51374
* combine.c (can_combine_p): Don't allow volatile_refs_p insns
to cross other volatile_refs_p insns.
2012-02-01 Richard Guenther <rguenther@suse.de>
* doc/invoke.texi (fno-inline): Clarify documentation.
......
......@@ -1700,6 +1700,7 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED,
rtx link;
#endif
bool all_adjacent = true;
int (*is_volatile_p) (const_rtx);
if (succ)
{
......@@ -1948,11 +1949,17 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED,
&& REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
return 0;
/* If there are any volatile insns between INSN and I3, reject, because
they might affect machine state. */
/* If INSN contains volatile references (specifically volatile MEMs),
we cannot combine across any other volatile references.
Even if INSN doesn't contain volatile references, any intervening
volatile insn might affect machine state. */
is_volatile_p = volatile_refs_p (PATTERN (insn))
? volatile_refs_p
: volatile_insn_p;
for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
if (INSN_P (p) && p != succ && p != succ2 && volatile_insn_p (PATTERN (p)))
if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
return 0;
/* If INSN contains an autoincrement or autodecrement, make sure that
......
2012-02-01 Georg-Johann Lay <avr@gjlay.de>
PR rtl-optimization/51374
* testsuite/gcc.target/avr/torture/pr51374-1.c: New.
2012-01-31 Tobias Burnus <burnus@net-b.de>
PR fortran/52024
......
/* PR rtl-optimization/51374 */
/* { dg-do compile } */
void vector_18 (void)
{
extern char slot;
unsigned char status = (*(volatile unsigned char*) 0x2B);
unsigned char data = (*(volatile unsigned char*) 0x2C);
if (status & 0x10)
slot = 0;
}
/* { dg-final { scan-assembler-not "\tsbic " } } */
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