diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2012-02-01 11:35:34 +0000 |
---|---|---|
committer | Georg-Johann Lay <gjl@gcc.gnu.org> | 2012-02-01 11:35:34 +0000 |
commit | 07ad5438a12e26c3d361462ea5e3e3163b2928e0 (patch) | |
tree | 157006ab69f61f15564411baac61ae0b1b51e9d3 /gcc | |
parent | 76a3962fe967dfde16d1b16460149d42680651b0 (diff) | |
download | gcc-07ad5438a12e26c3d361462ea5e3e3163b2928e0.zip gcc-07ad5438a12e26c3d361462ea5e3e3163b2928e0.tar.gz gcc-07ad5438a12e26c3d361462ea5e3e3163b2928e0.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/avr/torture/pr51374-1.c | 14 |
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32a86f0..60c43a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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. diff --git a/gcc/combine.c b/gcc/combine.c index beb980b..582db1f 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 23a0ef4..18a7276 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/gcc.target/avr/torture/pr51374-1.c b/gcc/testsuite/gcc.target/avr/torture/pr51374-1.c new file mode 100644 index 0000000..b31d173 --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/torture/pr51374-1.c @@ -0,0 +1,14 @@ +/* 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 " } } */ |