re PR target/67839 (Bit addressable instructions generated for invalid memory address)
authorSenthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
Wed, 28 Oct 2015 17:35:27 +0000 (17:35 +0000)
committerDenis Chertykov <denisc@gcc.gnu.org>
Wed, 28 Oct 2015 17:35:27 +0000 (20:35 +0300)
gcc/ChangeLog

PR target/67839
* config/avr/predicates.md (low_io_address_operand): Don't
consider MODE when computing upper bound.
(io_address_operand): Likewise.

gcc/testsuite/ChangeLog

PR target/67839
* gcc.target/avr/pr67839.c: New test.

From-SVN: r229495

gcc/ChangeLog
gcc/config/avr/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/avr/pr67839.c [new file with mode: 0644]

index dfe2bad..791aaf8 100644 (file)
@@ -1,3 +1,10 @@
+2015-10-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       PR target/67839
+       * config/avr/predicates.md (low_io_address_operand): Don't
+       consider MODE when computing upper bound.
+       (io_address_operand): Likewise.
+
 2015-10-28  Jan Hubicka  <hubicka@ucw.cz>
 
        * fold-const.c (operand_equal_p): Do not verify that types are
index 2d12bc6..622bc0b 100644 (file)
@@ -46,7 +46,7 @@
 (define_special_predicate "low_io_address_operand"
   (ior (and (match_code "const_int")
            (match_test "IN_RANGE (INTVAL (op) - avr_arch->sfr_offset,
-                                  0, 0x20 - GET_MODE_SIZE (mode))"))
+                                  0, 0x1F)"))
        (and (match_code "symbol_ref")
            (match_test "SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_IO_LOW"))))
 
@@ -60,7 +60,7 @@
 (define_special_predicate "io_address_operand"
   (ior (and (match_code "const_int")
            (match_test "IN_RANGE (INTVAL (op) - avr_arch->sfr_offset,
-                                  0, 0x40 - GET_MODE_SIZE (mode))"))
+                                  0, 0x3F)"))
        (and (match_code "symbol_ref")
            (match_test "SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_IO"))))
 
index 5b0c237..cc04c43 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-05  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       PR target/67839
+       * gcc.target/avr/pr67839.c: New test.
+
 2015-10-28  Richard Biener  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/operand-equal-2.c: Adjust.
diff --git a/gcc/testsuite/gcc.target/avr/pr67839.c b/gcc/testsuite/gcc.target/avr/pr67839.c
new file mode 100644 (file)
index 0000000..604ab4b
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler "sbi 0x1f,0" } } */
+/* { dg-final { scan-assembler "cbi 0x1f,0" } } */
+/* { dg-final { scan-assembler-not "sbi 0x20,0" } } */
+/* { dg-final { scan-assembler-not "cbi 0x20,0" } } */
+/* { dg-final { scan-assembler "in r\\d+,__SREG__" } } */
+/* { dg-final { scan-assembler "out __SREG__,r\\d+" } } */
+/* { dg-final { scan-assembler-not "in r\\d+,0x40" } } */
+/* { dg-final { scan-assembler-not "out 0x40, r\\d+" } } */
+
+/* This testcase verifies that SBI/CBI/SBIS/SBIC
+   and IN/OUT instructions are not generated for
+   an IO addresses outside the valid range.
+*/
+#define IO_ADDR(x) (*((volatile char *)x + __AVR_SFR_OFFSET__))
+int main ()
+{
+  IO_ADDR(0x1f) |= 1;
+  IO_ADDR(0x1f) &= 0xFE;
+
+  IO_ADDR(0x20) |= 1;
+  IO_ADDR(0x20) &= 0xFE;
+
+  IO_ADDR(0x3f) = IO_ADDR(0x3f);
+
+  IO_ADDR(0x40) = IO_ADDR(0x40);
+  return 0;
+}