]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/66922 (wrong code for bit-field struct at -O1 and above on x86_64-linux...
authorUros Bizjak <ubizjak@gmail.com>
Sat, 18 Jul 2015 11:36:32 +0000 (13:36 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sat, 18 Jul 2015 11:36:32 +0000 (13:36 +0200)
PR target/66922
* config/i386/i386.c (ix86_expand_pinsr): Reject insertions
to misaligned positions.

testsuite/ChangeLog:

PR target/66922
* gcc.target/i386/pr66922.c: New test.

From-SVN: r225982

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr66922.c [new file with mode: 0644]

index e895ed07a851eec7c103d1eecd15cfc0848a6f76..cc3a787968ff6511ab16b1bac19bb883849adca8 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/66922
+       * config/i386/i386.c (ix86_expand_pinsr): Reject insertions
+       to misaligned positions.
+
 2015-07-17  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/66866
index 7fc19e6b95d661f0140c07d429977fb009703cea..704e98639620181f1931f56ae3cde803858e7db8 100644 (file)
@@ -45381,6 +45381,10 @@ ix86_expand_pinsr (rtx *operands)
            return false;
          }
 
+       /* Reject insertions to misaligned positions.  */
+       if (pos & (size-1))
+         return false;
+
        rtx d = dst;
        if (GET_MODE (dst) != dstmode)
          d = gen_reg_rtx (dstmode);
index 72bb72703bd9c16cf41cf1b60d815163d1ebea9a..3f601cbc81e000acef47458243f5eb06b6554548 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/66922
+       * gcc.target/i386/pr66922.c: New test.
+
 2015-07-17  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/66866
diff --git a/gcc/testsuite/gcc.target/i386/pr66922.c b/gcc/testsuite/gcc.target/i386/pr66922.c
new file mode 100644 (file)
index 0000000..46274b2
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -msse2" } */
+/* { dg-require-effective-target sse2 } */
+
+#include "sse2-check.h"
+
+struct S 
+{
+  int:31;
+  int:2;
+  int f0:16;
+  int f1;
+  int f2;
+};
+
+static void 
+sse2_test (void)
+{
+  struct S a = { 1, 0, 0 };
+
+  if (a.f0 != 1)
+    __builtin_abort(); 
+}