aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSenthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>2015-10-28 17:35:27 +0000
committerDenis Chertykov <denisc@gcc.gnu.org>2015-10-28 20:35:27 +0300
commitf64ba10b91544a8a9ad304e6be1cac8809513faa (patch)
treea95df8b1a41358fb5dd2000d81813deb758900bb
parentc5ab2fd47817b89703839f11c458ccba966cfd65 (diff)
downloadgcc-f64ba10b91544a8a9ad304e6be1cac8809513faa.zip
gcc-f64ba10b91544a8a9ad304e6be1cac8809513faa.tar.gz
gcc-f64ba10b91544a8a9ad304e6be1cac8809513faa.tar.bz2
re PR target/67839 (Bit addressable instructions generated for invalid memory address)
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/avr/predicates.md4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/avr/pr67839.c29
4 files changed, 43 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dfe2bad..791aaf8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/avr/predicates.md b/gcc/config/avr/predicates.md
index 2d12bc6..622bc0b 100644
--- a/gcc/config/avr/predicates.md
+++ b/gcc/config/avr/predicates.md
@@ -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"))))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5b0c237..cc04c43 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..604ab4b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/pr67839.c
@@ -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;
+}