]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 16:15:53 +0000 (17:15 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 15 Mar 2017 16:15:53 +0000 (17:15 +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: r246168

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

index e7c87c4b9d02b38c73475fd26453a7cada30a1fe..da65dbb3ad42d2456a18a94b5b6a3d552a4b1bf6 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-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        Back port from trunk
index cee8a00767c1491f500bbb0c28443ba1a9dd0aae..f878a79b92404fd2244a1329903ef2738f650d91 100644 (file)
@@ -43989,10 +43989,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 684c841f073efbd152a6798619b9f8e6dd88ab0b..df9080c378769b41947cbb5fd35ac0499e3f30b5 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-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        Back port from trunk
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;
+}