diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-11-03 09:24:28 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-11-03 09:24:28 +0000 |
commit | a34a16abe50b14dfb23929a0e596275ab7fd11e2 (patch) | |
tree | 709552d36c9010d5bdb45960cf0a95762cf90c40 | |
parent | f53bd856482af56a7af70bbae243f0c2af296b0e (diff) | |
download | gcc-a34a16abe50b14dfb23929a0e596275ab7fd11e2.zip gcc-a34a16abe50b14dfb23929a0e596275ab7fd11e2.tar.gz gcc-a34a16abe50b14dfb23929a0e596275ab7fd11e2.tar.bz2 |
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 <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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr82809.c | 22 |
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7502184..d49923f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 2967872..1cf1e2b 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 6e2abdd..8159009 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..9f74ee8 --- /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; + } +} |