aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2014-10-29 12:33:42 -0400
committerDJ Delorie <dj@gcc.gnu.org>2014-10-29 12:33:42 -0400
commit40f94f7d731023b1461887dec0e1e9a57daa8343 (patch)
tree2169d53e1afa85a4fa8361bcf004fa7565e95f3e
parent5cf18d250f37b6c86b26d17e0cbb22a0c0d18e03 (diff)
downloadgcc-40f94f7d731023b1461887dec0e1e9a57daa8343.zip
gcc-40f94f7d731023b1461887dec0e1e9a57daa8343.tar.gz
gcc-40f94f7d731023b1461887dec0e1e9a57daa8343.tar.bz2
expmed.c (strict_volatile_bitfield_p): Fix off-by-one error.
* expmed.c (strict_volatile_bitfield_p): Fix off-by-one error. * gcc.dg/20141029-1.c: New. From-SVN: r216844
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/expmed.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/20141029-1.c28
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59e562c..138fecd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 2f53ecf..7dabe75 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2e4073f..2955cfd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..b25af57
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20141029-1.c
@@ -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" } } */