From: Uros Bizjak Date: Fri, 14 Nov 2008 07:59:33 +0000 (+0100) Subject: backport: re PR rtl-optimization/36438 (gcc ICE compiling code with mmx builtin) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6684599e6480faaef84c605c5c35de5d4c0d794b;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/36438 (gcc ICE compiling code with mmx builtin) Backport from mainline: 2008-06-06 Uros Bizjak PR rtl-optimization/36438 * cse.c (fold_rtx) [ASHIFT, LSHIFTRT, ASHIFTRT]: Break out early for vector shifts with constant scalar shift operands. testsuite/ChangeLog: Backport from mainline: 2008-06-06 Uros Bizjak PR rtl-optimization/36438 * gcc.target/i386/pr36438.c From-SVN: r141849 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97554189b7e2..fa409a39dbe2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-11-13 Uros Bizjak + + Backport from mainline: + 2008-06-06 Uros Bizjak + + PR rtl-optimization/36438 + * cse.c (fold_rtx) [ASHIFT, LSHIFTRT, ASHIFTRT]: Break out early + for vector shifts with constant scalar shift operands. + 2008-11-12 Jason Merrill PR c++/38007 diff --git a/gcc/cse.c b/gcc/cse.c index d0cf29719044..15a2a7af556c 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -4372,6 +4372,11 @@ fold_rtx (rtx x, rtx insn) && exact_log2 (- INTVAL (const_arg1)) >= 0))) break; + /* ??? Vector mode shifts by scalar + shift operand are not supported yet. */ + if (is_shift && VECTOR_MODE_P (mode)) + break; + if (is_shift && (INTVAL (inner_const) >= GET_MODE_BITSIZE (mode) || INTVAL (inner_const) < 0)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b37c568c2560..d61c2b1d74cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-11-13 Uros Bizjak + + Backport from mainline: + 2008-06-06 Uros Bizjak + + PR rtl-optimization/36438 + * gcc.target/i386/pr36438.c + 2008-11-13 Jason Merrill PR c++/37932 @@ -17,7 +25,7 @@ PR middle-end/37807 PR middle-end/37809 - * gcc/testsuite/gcc.target/i386/mmx-8.c: New test. + * gcc.target/i386/mmx-8.c: New test. 2008-10-07 H.J. Lu diff --git a/gcc/testsuite/gcc.target/i386/pr36438.c b/gcc/testsuite/gcc.target/i386/pr36438.c new file mode 100644 index 000000000000..73b5b9dffa69 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr36438.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mmmx" } */ + +#include + +extern __m64 SetS16 (unsigned short, unsigned short, + unsigned short, unsigned short); + +void +foo (__m64 * dest) +{ + __m64 mask = SetS16 (0x00FF, 0xFF00, 0x0000, 0x00FF); + + mask = _mm_slli_si64 (mask, 8); + mask = _mm_slli_si64 (mask, 8); + + *dest = mask; + + _mm_empty (); +}