PR82809: register handling in ix86_vector_duplicate_value
authorRichard Sandiford <richard.sandiford@linaro.org>
Fri, 3 Nov 2017 09:24:28 +0000 (09:24 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 3 Nov 2017 09:24:28 +0000 (09:24 +0000)
When adding the call to gen_vec_duplicate, I failed to notice that
code further down modified the VEC_DUPLICATE in place.  That isn't
safe if gen_vec_duplicate returned a const_vector.

2017-11-02  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
PR target/82809
* config/i386/i386.c (ix86_vector_duplicate_value): Use
gen_vec_duplicate after forcing the scalar into a register.

gcc/testsuite/
* gcc.dg/pr82809.c: New test.

From-SVN: r254366

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

index 7502184f7db17fb9ffe569649b14318fa79f0945..d49923f37a3532a56ebc094656f65356d9f55505 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-03  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR target/82809
+       * config/i386/i386.c (ix86_vector_duplicate_value): Use
+       gen_vec_duplicate after forcing the scalar into a register.
+
 2017-11-02  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * combine (try_combine): Print the insns input to try_combine to the
index 29678722226f05730e8fafcb03c5d709866ce42a..1cf1e2b27a669649e304e5a27566c72fd7e2a00f 100644 (file)
@@ -41232,7 +41232,7 @@ ix86_vector_duplicate_value (machine_mode mode, rtx target, rtx val)
       reg = force_reg (innermode, val);
       if (GET_MODE (reg) != innermode)
        reg = gen_lowpart (innermode, reg);
-      XEXP (dup, 0) = reg;
+      SET_SRC (PATTERN (insn)) = gen_vec_duplicate (mode, reg);
       seq = get_insns ();
       end_sequence ();
       if (seq)
index 6e2abdd9e171e15c720a19d336e800c06fdcc571..8159009a85afa58f1a727e6fe8d3a2475f4c4fad 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-03  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * gcc.dg/pr82809.c: New test.
+
 2017-11-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/81957
diff --git a/gcc/testsuite/gcc.dg/pr82809.c b/gcc/testsuite/gcc.dg/pr82809.c
new file mode 100644 (file)
index 0000000..9f74ee8
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast -fno-tree-dominator-opts" } */
+
+struct locale_time_t
+{
+  const char *abday[7];
+  const unsigned int *wabday[7];
+};
+
+static const unsigned int empty_wstr[1] = { 0 };
+
+void
+time_read (struct locale_time_t *time)
+{
+  int cnt;
+
+  for (cnt=0; cnt < 7; cnt++)
+    {
+      time->abday[cnt] = "";
+      time->wabday[cnt] = empty_wstr;
+    }
+}