From: Uros Bizjak Date: Fri, 17 Jul 2015 21:39:27 +0000 (+0200) Subject: re PR target/66866 (incorrect load address on manual vector shuffle) X-Git-Tag: releases/gcc-4.9.4~695 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58952c94489e7912c249c12d6f2cf3d0939e79e5;p=thirdparty%2Fgcc.git re PR target/66866 (incorrect load address on manual vector shuffle) PR target/66866 * config/i386/i386.c (ix86_expand_pinsr): Reject non-lowpart source subregs. testsuite/ChangeLog: PR target/66866 * g++.dg/pr66866.C: New test. From-SVN: r225970 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a52f55a1b31..8b158f3c6d81 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-07-17 Uros Bizjak + + PR target/66866 + * config/i386/i386.c (ix86_expand_pinsr): Reject non-lowpart + source subregs. + 2015-06-17 Uros Bizjak Backport from mainline: diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5d208416a366..7fc19e6b95d6 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -45320,15 +45320,20 @@ ix86_expand_pinsr (rtx *operands) unsigned int size = INTVAL (operands[1]); unsigned int pos = INTVAL (operands[2]); + if (GET_CODE (src) == SUBREG) + { + /* Reject non-lowpart subregs. */ + if (SUBREG_BYTE (src) != 0) + return false; + src = SUBREG_REG (src); + } + if (GET_CODE (dst) == SUBREG) { pos += SUBREG_BYTE (dst) * BITS_PER_UNIT; dst = SUBREG_REG (dst); } - if (GET_CODE (src) == SUBREG) - src = SUBREG_REG (src); - switch (GET_MODE (dst)) { case V16QImode: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ff28ecfd72f..c9259c52bea8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-07-17 Uros Bizjak + + PR target/66866 + * g++.dg/pr66866.C: New test. + 2015-06-17 Uros Bizjak Backport from mainline: diff --git a/gcc/testsuite/g++.dg/pr66866.C b/gcc/testsuite/g++.dg/pr66866.C new file mode 100644 index 000000000000..72ff3b192a8e --- /dev/null +++ b/gcc/testsuite/g++.dg/pr66866.C @@ -0,0 +1,29 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target sse2_runtime } +// { dg-options "-O -msse2" } + +extern "C" void abort (void); + +typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef short A __attribute__((__may_alias__)); + +__m128i __attribute__((noinline)) +shuf(const __m128i v) +{ + __m128i r; + + reinterpret_cast(&r)[5] = reinterpret_cast(&v)[4]; + return r; +} + +int main() +{ + __attribute__((aligned(16))) short mem[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + + *reinterpret_cast<__m128i *>(mem) = shuf (*reinterpret_cast<__m128i *>(mem)); + + if (mem[5] != 4) + abort (); + + return 0; +}