]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/69551 (Wrong code with single element vector insert)
authorJakub Jelinek <jakub@redhat.com>
Fri, 29 Jan 2016 14:14:56 +0000 (15:14 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 29 Jan 2016 14:14:56 +0000 (15:14 +0100)
PR target/69551
* config/i386/i386.c (ix86_expand_vector_set) <case V4SImode>: For
SSE1, copy target into the temporary reg first before recursing
on it.

* gcc.target/i386/pr69551.c: New test.

From-SVN: r232982

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

index 8e06ddb9e17272ec036ee830cd473c670ff69ced..9f998427113f74b9c6ad969dc5f442918c071464 100644 (file)
@@ -1,3 +1,10 @@
+2016-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/69551
+       * config/i386/i386.c (ix86_expand_vector_set) <case V4SImode>: For
+       SSE1, copy target into the temporary reg first before recursing
+       on it.
+
 2016-01-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/sse.md (sse2_cvtps2pd<mask_name>): Replace vBm
index 6dc1fa54e9bff5b34771c6fb24027f78ba40e7d5..b5002337cf46698e4cd087af8e22444f58e38af9 100644 (file)
@@ -46744,6 +46744,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
        {
          /* For SSE1, we have to reuse the V4SF code.  */
          rtx t = gen_reg_rtx (V4SFmode);
+         emit_move_insn (t, gen_lowpart (V4SFmode, target));
          ix86_expand_vector_set (false, t, gen_lowpart (SFmode, val), elt);
          emit_move_insn (target, gen_lowpart (mode, t));
        }
index e41c9896de241511b7b4d435ed6f663f6f6b4623..150ebc803ac489e0df2148042e3c114125da0444 100644 (file)
@@ -1,5 +1,8 @@
 2016-01-29  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/69551
+       * gcc.target/i386/pr69551.c: New test.
+
        PR target/66137
        * gcc.target/i386/pr66137.c: New test.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr69551.c b/gcc/testsuite/gcc.target/i386/pr69551.c
new file mode 100644 (file)
index 0000000..1505fc2
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR target/69551 */
+/* { dg-do run { target sse_runtime } } */
+/* { dg-options "-O2 -mno-sse2 -msse" } */
+
+typedef unsigned char v16qi __attribute__ ((vector_size (16)));
+typedef unsigned int v4si __attribute__ ((vector_size (16)));
+
+char __attribute__ ((noinline, noclone))
+test (v4si vec)
+{
+  vec[1] = 0x5fb856;
+  return ((v16qi) vec)[0];
+}
+
+int
+main ()
+{
+  char z = test ((v4si) { -1, -1, -1, -1 });
+
+  if (z != -1)
+    __builtin_abort ();
+  return 0;
+}