re PR target/80019 (ICE in ix86_vector_duplicate_value, at config/i386/i386.c:42584)
authorUros Bizjak <ubizjak@gmail.com>
Wed, 15 Mar 2017 13:38:51 +0000 (14:38 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 15 Mar 2017 13:38:51 +0000 (14:38 +0100)
PR target/80019
* config/i386/i386.c (ix86_vector_duplicate_value): Create
subreg of inner mode for values already in registers.

testsuite/ChangeLog:

PR target/80019
* gcc.target/i386/pr80019.c: New test.

From-SVN: r246161

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

index eacca234bef3fc1eb27ceb0110cdb7ecd33474f5..13c5c0df2e1c6d931bde808e846639e7f14e5e96 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-15  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/80019
+       * config/i386/i386.c (ix86_vector_duplicate_value): Create
+       subreg of inner mode for values already in registers.
+
 2017-03-15  Bernd Schmidt  <bschmidt@redhat.com>
 
        * config/c6x/c6x.c (hwloop_optimize): Handle case where the old
index 5fcd51f138599f4223559941439689fe8574ef1b..f58d529604c4208d936ca898f45a44eff9032ee5 100644 (file)
@@ -42571,10 +42571,16 @@ ix86_vector_duplicate_value (machine_mode mode, rtx target, rtx val)
   if (recog_memoized (insn) < 0)
     {
       rtx_insn *seq;
+      machine_mode innermode = GET_MODE_INNER (mode);
+      rtx reg;
+
       /* If that fails, force VAL into a register.  */
 
       start_sequence ();
-      XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
+      reg = force_reg (innermode, val);
+      if (GET_MODE (reg) != innermode)
+       reg = gen_lowpart (innermode, reg);
+      XEXP (dup, 0) = reg;
       seq = get_insns ();
       end_sequence ();
       if (seq)
index cca75c7ee7d08399b974497bc01c55a4a12b3c86..608f958c5ba64bbe31dd06702967528a9b378205 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-15  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/80019
+       * gcc.target/i386/pr80019.c: New test.
+
 2017-03-15  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/tree-prof/pr66295.c: Removed unused dg-error.
diff --git a/gcc/testsuite/gcc.target/i386/pr80019.c b/gcc/testsuite/gcc.target/i386/pr80019.c
new file mode 100644 (file)
index 0000000..35ec960
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR target/80019 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mxop -mavx2" } */
+
+typedef char v16qi __attribute__ ((vector_size (16)));
+
+extern v16qi b, c;
+
+void
+foo (int e)
+{
+  b = c << e;
+}