diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-08-25 19:49:26 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-08-25 19:49:26 +0200 |
commit | 932c9bffa0224eb16e061da1802f6f95fb23e7d3 (patch) | |
tree | 8a8acf4b9ce8ddbeb52fe565d42d09aae104ca03 | |
parent | d8099dd8599b3fb226b451a1d421046ace4c6307 (diff) | |
download | gcc-932c9bffa0224eb16e061da1802f6f95fb23e7d3.zip gcc-932c9bffa0224eb16e061da1802f6f95fb23e7d3.tar.gz gcc-932c9bffa0224eb16e061da1802f6f95fb23e7d3.tar.bz2 |
re PR rtl-optimization/45400 (XBMC AudioEngine Compilation C++ Internal Compiler Error /w Optimization)
PR rtl-optimization/45400
* combine.c (simplify_shift_const_1) <case SUBREG>: Only use
SUBREG_REG if both modes are of MODE_INT class.
* g++.dg/other/i386-8.C: New test.
From-SVN: r163551
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/i386-8.C | 23 |
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb6ebd9..1123d07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-25 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/45400 + * combine.c (simplify_shift_const_1) <case SUBREG>: Only use + SUBREG_REG if both modes are of MODE_INT class. + 2010-08-25 Julian Brown <julian@codesourcery.com> * config/arm/arm.c (arm_issue_rate): Return 2 for Cortex-A5. diff --git a/gcc/combine.c b/gcc/combine.c index 94e6839..acff541 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -9858,7 +9858,9 @@ simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode, > GET_MODE_SIZE (GET_MODE (varop))) && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) - == mode_words) + == mode_words + && GET_MODE_CLASS (GET_MODE (varop)) == MODE_INT + && GET_MODE_CLASS (GET_MODE (SUBREG_REG (varop))) == MODE_INT) { varop = SUBREG_REG (varop); if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 372024f..fd9f5ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-25 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/45400 + * g++.dg/other/i386-8.C: New test. + 2010-08-25 Richard Guenther <rguenther@suse.de> * gcc.dg/alias-8.c: Adjust. diff --git a/gcc/testsuite/g++.dg/other/i386-8.C b/gcc/testsuite/g++.dg/other/i386-8.C new file mode 100644 index 0000000..7de75c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-8.C @@ -0,0 +1,23 @@ +// PR rtl-optimization/45400 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2 -msse2" } +// { dg-options "-O2 -msse2 -fpic" { target fpic } } +// { dg-require-effective-target sse2 } + +#include <xmmintrin.h> + +static inline unsigned short +bar (unsigned short x) +{ + return ((x << 8) | (x >> 8)); +} + +unsigned int +foo (float *x, short *y) +{ + __m128 a = _mm_set_ps1 (32767.5f); + __m128 b = _mm_mul_ps (_mm_load_ps (x), a); + __m64 c = _mm_cvtps_pi16 (b); + __builtin_memcpy (y, &c, sizeof (short) * 4); + y[0] = bar (y[0]); +} |