re PR target/70421 (wrong code with v16si vector and useless cast at -O -mavx512f)
authorJakub Jelinek <jakub@gcc.gnu.org>
Wed, 30 Mar 2016 14:06:51 +0000 (16:06 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 30 Mar 2016 14:06:51 +0000 (16:06 +0200)
PR target/70421
* config/i386/i386.c (ix86_expand_vector_set): Fix up argument order
in gen_blendm expander.

* gcc.dg/torture/pr70421.c: New test.
* gcc.target/i386/avx512f-pr70421.c: New test.

From-SVN: r234569

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr70421.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/avx512f-pr70421.c [new file with mode: 0644]

index 641bf2579c22a3073727395f85dd8e7905bf4057..db870ff9689c0650d45b1835cd1f6f4c2b99b77b 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/70421
+       * config/i386/i386.c (ix86_expand_vector_set): Fix up argument order
+       in gen_blendm expander.
+
 2016-03-30  Nick Clifton  <nickc@redhat.com>
 
        PR target/62254
@@ -5,7 +11,7 @@
        case where we are already provided with an SImode SUBREG.
 
 2016-03-30  Michael Matz  <matz@suse.de>
-       Richard Biener  <rguenther@suse.de>
+           Richard Biener  <rguenther@suse.de>
 
        PR ipa/12392
        * ipa-polymorphic-call.c (struct type_change_info): Change
index f700a25e1c0f551db6f13319ec85244d24e2a714..7a75a31741b03af588cc38b4d6e4e65ae20b9586 100644 (file)
@@ -46932,7 +46932,12 @@ half:
     {
       tmp = gen_reg_rtx (mode);
       emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
-      emit_insn (gen_blendm (target, tmp, target,
+      /* The avx512*_blendm<mode> expanders have different operand order
+        from VEC_MERGE.  In VEC_MERGE, the first input operand is used for
+        elements where the mask is set and second input operand otherwise,
+        in {sse,avx}*_*blend* the first input operand is used for elements
+        where the mask is clear and second input operand otherwise.  */
+      emit_insn (gen_blendm (target, target, tmp,
                             force_reg (mmode,
                                        gen_int_mode (1 << elt, mmode))));
     }
index 2d0ecdab899025dde6afd5a5e0f0e691dda47748..b2dfebfa0a75b6293705dbc58ebbe6bd6e2114f5 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/70421
+       * gcc.dg/torture/pr70421.c: New test.
+       * gcc.target/i386/avx512f-pr70421.c: New test.
+
 2016-03-30  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR tree-optimization/59124
diff --git a/gcc/testsuite/gcc.dg/torture/pr70421.c b/gcc/testsuite/gcc.dg/torture/pr70421.c
new file mode 100644 (file)
index 0000000..8f97acd
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR target/70421 */
+/* { dg-do run } */
+/* { dg-additional-options "-Wno-psabi -w" } */
+
+typedef unsigned V __attribute__ ((vector_size (64)));
+
+unsigned __attribute__ ((noinline, noclone))
+foo (unsigned x, V u, V v)
+{
+  v[1] ^= v[2];
+  x ^= ((V) v)[u[0]];
+  return x;
+}
+
+int
+main ()
+{
+  unsigned x = foo (0x10, (V) { 1 }, (V) { 0x100, 0x1000, 0x10000 });
+  if (x != 0x11010)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-pr70421.c b/gcc/testsuite/gcc.target/i386/avx512f-pr70421.c
new file mode 100644 (file)
index 0000000..60e1e2a
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/70421 */
+/* { dg-do run } */
+/* { dg-require-effective-target avx512f } */
+/* { dg-options "-O2 -mavx512f" } */
+
+#include "avx512f-check.h"
+
+#define main() do_main()
+#include "../../gcc.dg/torture/pr70421.c"
+
+static void
+avx512f_test (void)
+{
+  do_main ();
+}