From: Uros Bizjak Date: Fri, 29 Jan 2016 19:52:30 +0000 (+0100) Subject: backport: re PR target/69551 (Wrong code with single element vector insert) X-Git-Tag: releases/gcc-4.9.4~367 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc2a856c0fa10fc6e24ceb271b9d6241fff93951;p=thirdparty%2Fgcc.git backport: re PR target/69551 (Wrong code with single element vector insert) Backport from mainline 2016-01-29 Jakub Jelinek PR target/69551 * config/i386/i386.c (ix86_expand_vector_set) : For SSE1, copy target into the temporary reg first before recursing on it. testsuite/ChangeLog: Backport from mainline 2016-01-29 Jakub Jelinek PR target/69551 * gcc.target/i386/pr69551.c: New test. From-SVN: r232996 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index feda63843e35..8db15316a69b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-01-29 Uros Bizjak + + Backport from mainline + 2016-01-29 Jakub Jelinek + + PR target/69551 + * config/i386/i386.c (ix86_expand_vector_set) : For + SSE1, copy target into the temporary reg first before recursing + on it. + 2016-01-29 Uros Bizjak PR target/69459 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c6d0102ae1cd..bd1bfaacabba 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -40655,6 +40655,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 17b6cb820fce..017c33fea393 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-01-29 Uros Bizjak + + Backport from mainline + 2016-01-29 Jakub Jelinek + + PR target/69551 + * gcc.target/i386/pr69551.c: New test. + 2016-01-29 Uros Bizjak PR target/69459 diff --git a/gcc/testsuite/gcc.target/i386/pr69551.c b/gcc/testsuite/gcc.target/i386/pr69551.c new file mode 100644 index 000000000000..1505fc21dbf8 --- /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; +}