diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-01-29 15:14:56 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-01-29 15:14:56 +0100 |
commit | 33e89989f63ba5148362ecbdaed7d6c62e74e8ea (patch) | |
tree | c1eea9e33258bfda7afffd611b53e331499845ac /gcc | |
parent | 26658b7c9eac91964546e8064b3097ced4c492d1 (diff) | |
download | gcc-33e89989f63ba5148362ecbdaed7d6c62e74e8ea.zip gcc-33e89989f63ba5148362ecbdaed7d6c62e74e8ea.tar.gz gcc-33e89989f63ba5148362ecbdaed7d6c62e74e8ea.tar.bz2 |
re PR target/69551 (Wrong code with single element vector insert)
PR target/69551
* config/i386/i386.c (ix86_expand_vector_set) <case V4SImode>: For
SSE1, copy target into the temporary reg first before recursing
on it.
* gcc.target/i386/pr69551.c: New test.
From-SVN: r232982
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr69551.c | 23 |
4 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e06ddb..9f99842 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-01-29 Jakub Jelinek <jakub@redhat.com> + + PR target/69551 + * config/i386/i386.c (ix86_expand_vector_set) <case V4SImode>: For + SSE1, copy target into the temporary reg first before recursing + on it. + 2016-01-29 H.J. Lu <hongjiu.lu@intel.com> * config/i386/sse.md (sse2_cvtps2pd<mask_name>): Replace vBm diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6dc1fa5..b500233 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -46744,6 +46744,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt) { /* For SSE1, we have to reuse the V4SF code. */ rtx t = gen_reg_rtx (V4SFmode); + emit_move_insn (t, gen_lowpart (V4SFmode, target)); ix86_expand_vector_set (false, t, gen_lowpart (SFmode, val), elt); emit_move_insn (target, gen_lowpart (mode, t)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e41c989..150ebc8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-01-29 Jakub Jelinek <jakub@redhat.com> + PR target/69551 + * gcc.target/i386/pr69551.c: New test. + PR target/66137 * gcc.target/i386/pr66137.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr69551.c b/gcc/testsuite/gcc.target/i386/pr69551.c new file mode 100644 index 0000000..1505fc2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr69551.c @@ -0,0 +1,23 @@ +/* PR target/69551 */ +/* { dg-do run { target sse_runtime } } */ +/* { dg-options "-O2 -mno-sse2 -msse" } */ + +typedef unsigned char v16qi __attribute__ ((vector_size (16))); +typedef unsigned int v4si __attribute__ ((vector_size (16))); + +char __attribute__ ((noinline, noclone)) +test (v4si vec) +{ + vec[1] = 0x5fb856; + return ((v16qi) vec)[0]; +} + +int +main () +{ + char z = test ((v4si) { -1, -1, -1, -1 }); + + if (z != -1) + __builtin_abort (); + return 0; +} |