From a34a16abe50b14dfb23929a0e596275ab7fd11e2 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 3 Nov 2017 09:24:28 +0000 Subject: [PATCH] PR82809: register handling in ix86_vector_duplicate_value 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 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 | 6 ++++++ gcc/config/i386/i386.c | 2 +- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/pr82809.c | 22 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr82809.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7502184f7db..d49923f37a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-11-03 Richard Sandiford + + 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 * combine (try_combine): Print the insns input to try_combine to the diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 29678722226..1cf1e2b27a6 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e2abdd9e17..8159009a85a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-11-03 Richard Sandiford + + * gcc.dg/pr82809.c: New test. + 2017-11-02 Paolo Carlini PR c++/81957 diff --git a/gcc/testsuite/gcc.dg/pr82809.c b/gcc/testsuite/gcc.dg/pr82809.c new file mode 100644 index 00000000000..9f74ee86534 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr82809.c @@ -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; + } +} -- 2.30.2