expmed.c (strict_volatile_bitfield_p): Fix off-by-one error.
authorDJ Delorie <dj@redhat.com>
Wed, 29 Oct 2014 16:33:42 +0000 (12:33 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Wed, 29 Oct 2014 16:33:42 +0000 (12:33 -0400)
* expmed.c (strict_volatile_bitfield_p): Fix off-by-one error.
* gcc.dg/20141029-1.c: New.

From-SVN: r216844

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20141029-1.c [new file with mode: 0644]

index 59e562c111b890146440e04c7a9dfb03621cc31d..138fecd1d887283ac90cf2444fc40d2da5528d35 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-29  DJ Delorie  <dj@redhat.com>
+
+       * expmed.c (strict_volatile_bitfield_p): Fix off-by-one error.
+
 2014-10-29  Martin Liska  <mliska@suse.cz>
 
        PR ipa/63587
index 2f53ecff102edcb021592f8fba1f3ba25b933c7b..7dabe75c8f4fecf0eb2d28baa054161af7691f07 100644 (file)
@@ -457,7 +457,7 @@ strict_volatile_bitfield_p (rtx op0, unsigned HOST_WIDE_INT bitsize,
   /* Check for cases where the C++ memory model applies.  */
   if (bitregion_end != 0
       && (bitnum - bitnum % modesize < bitregion_start
-         || bitnum - bitnum % modesize + modesize > bitregion_end))
+         || bitnum - bitnum % modesize + modesize - 1 > bitregion_end))
     return false;
 
   return true;
index 2e4073fa08c2c6b87afb6994cd245f2615021a9b..2955cfd58e3f8fe017d69bfdcec137b4ff239c6d 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-29  DJ Delorie  <dj@redhat.com>
+
+       * gcc.dg/20141029-1.c: New.
+
 2014-10-29  Martin Liska  <mliska@suse.cz>
 
        PR ipa/63587
diff --git a/gcc/testsuite/gcc.dg/20141029-1.c b/gcc/testsuite/gcc.dg/20141029-1.c
new file mode 100644 (file)
index 0000000..b25af57
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-fstrict-volatile-bitfields -fdump-rtl-final" } */
+
+#define PERIPH (*(volatile struct system_periph *)0x81234)
+
+struct system_periph {
+  union {
+    unsigned short WORD;
+    struct {
+      unsigned short a:1;
+      unsigned short b:1;
+      unsigned short  :5;
+      unsigned short c:1;
+      unsigned short  :8;
+    } BIT;
+  } ALL;
+};
+
+void
+foo()
+{
+  while (1)
+    {
+      PERIPH.ALL.BIT.a = 1;
+    }
+}
+/* { dg-final { scan-rtl-dump-times "mem/v(/.)*:HI" 4 "final" } } */
+/* { dg-final { cleanup-rtl-dump "final" } } */