]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/66866 (incorrect load address on manual vector shuffle)
authorUros Bizjak <ubizjak@gmail.com>
Fri, 17 Jul 2015 21:39:27 +0000 (23:39 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 17 Jul 2015 21:39:27 +0000 (23:39 +0200)
PR target/66866
* config/i386/i386.c (ix86_expand_pinsr): Reject non-lowpart
source subregs.

testsuite/ChangeLog:

PR target/66866
* g++.dg/pr66866.C: New test.

From-SVN: r225970

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr66866.C [new file with mode: 0644]

index 4a52f55a1b31c8a2c97325f8530da50f3c81b798..8b158f3c6d81dbb641882d147ff6476c944fefc5 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-17  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/66866
+       * config/i386/i386.c (ix86_expand_pinsr): Reject non-lowpart
+       source subregs.
+
 2015-06-17  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline:
index 5d208416a366079c844e0a5f51e6cde6e66c3c2d..7fc19e6b95d661f0140c07d429977fb009703cea 100644 (file)
@@ -45320,15 +45320,20 @@ ix86_expand_pinsr (rtx *operands)
   unsigned int size = INTVAL (operands[1]);
   unsigned int pos = INTVAL (operands[2]);
 
+  if (GET_CODE (src) == SUBREG)
+    {
+      /* Reject non-lowpart subregs.  */
+      if (SUBREG_BYTE (src) != 0)
+       return false;
+      src = SUBREG_REG (src);
+    }
+
   if (GET_CODE (dst) == SUBREG)
     {
       pos += SUBREG_BYTE (dst) * BITS_PER_UNIT;
       dst = SUBREG_REG (dst);
     }
 
-  if (GET_CODE (src) == SUBREG)
-    src = SUBREG_REG (src);
-
   switch (GET_MODE (dst))
     {
     case V16QImode:
index 2ff28ecfd72fe3c6cd539a3a0cd7af2a609f60df..c9259c52bea88e8b4579402052e1c367f8f9967e 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-17  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/66866
+       * g++.dg/pr66866.C: New test.
+
 2015-06-17  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline:
diff --git a/gcc/testsuite/g++.dg/pr66866.C b/gcc/testsuite/g++.dg/pr66866.C
new file mode 100644 (file)
index 0000000..72ff3b1
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target sse2_runtime }
+// { dg-options "-O -msse2" }
+
+extern "C" void abort (void);
+
+typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
+typedef short A __attribute__((__may_alias__));
+
+__m128i __attribute__((noinline))
+shuf(const __m128i v)
+{
+  __m128i r;
+
+  reinterpret_cast<A *>(&r)[5] = reinterpret_cast<const A *>(&v)[4];
+  return r;
+}
+
+int main()
+{
+  __attribute__((aligned(16))) short mem[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+
+  *reinterpret_cast<__m128i *>(mem) = shuf (*reinterpret_cast<__m128i *>(mem));
+
+  if (mem[5] != 4)
+    abort ();
+
+  return 0;
+}