From a68e91392996b7f1859a9e11de1f9a0cf2268b9d Mon Sep 17 00:00:00 2001 From: Georg-Johann Lay Date: Wed, 1 Feb 2012 12:40:23 +0000 Subject: [PATCH] backport: re PR rtl-optimization/51374 ([avr] insn combine reorders volatile memory accesses) gcc/ Backport from mainline r183796 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/ Backport from mainline r183796 PR rtl-optimization/51374 * testsuite/gcc.target/avr/torture/pr51374-1.c: New. From-SVN: r183797 --- gcc/ChangeLog | 7 +++++++ gcc/combine.c | 13 ++++++++++--- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.target/avr/torture/pr51374-1.c | 15 +++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/avr/torture/pr51374-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 02e2c74f5470..f2816c4caaa8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-01-12 Georg-Johann Lay + + Backport from mainline r183796 + PR rtl-optimization/51374 + * combine.c (can_combine_p): Don't allow volatile_refs_p insns + to cross other volatile_refs_p insns. + 2012-01-31 Matthew Gretton-Dann Backport from mainline. diff --git a/gcc/combine.c b/gcc/combine.c index 0ffd284ca99e..5980fcbbb03a 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -1666,6 +1666,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) { @@ -1914,11 +1915,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 ae16f720eb7b..1d2e16516183 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-01-12 Georg-Johann Lay + + Backport from mainline r183796 + PR rtl-optimization/51374 + * testsuite/gcc.target/avr/torture/pr51374-1.c: New. + 2012-01-30 Bin Cheng Backport from mainline. 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 000000000000..9c98ea5f8e03 --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/torture/pr51374-1.c @@ -0,0 +1,15 @@ +/* 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 " } } */ +/* { dg-final { scan-assembler-not "\tsbis " } } */ -- 2.47.2