aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr48678.c16
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c44ebd..959d07b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/48678
+ * config/i386/i386.md (movstrict<mode>): FAIL if operands[0]
+ is a SUBREG with non-MODE_INT mode inside of it.
+
2011-04-19 Martin Jambor <mjambor@suse.cz>
* ipa-cp.c (ipcp_process_devirtualization_opportunities): Devirtualize
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 0e0ceed..38bdcd3 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2425,6 +2425,9 @@
{
if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
FAIL;
+ if (GET_CODE (operands[0]) == SUBREG
+ && GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT)
+ FAIL;
/* Don't generate memory->memory moves, go through a register */
if (MEM_P (operands[0]) && MEM_P (operands[1]))
operands[1] = force_reg (<MODE>mode, operands[1]);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 71c4556..0d47ecf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/48678
+ * gcc.target/i386/pr48678.c: New test.
+
2011-04-19 Martin Jambor <mjambor@suse.cz>
* g++.dg/opt/devirt1.C: Bump to -O2, remove XFAIL.
diff --git a/gcc/testsuite/gcc.target/i386/pr48678.c b/gcc/testsuite/gcc.target/i386/pr48678.c
new file mode 100644
index 0000000..6f6727f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr48678.c
@@ -0,0 +1,16 @@
+/* PR target/48678 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2" } */
+
+#include <emmintrin.h>
+
+typedef short T __attribute__((may_alias));
+struct S { __m128i d; };
+
+__m128i
+foo (short *x, struct S *y, __m128i *z)
+{
+ struct S s = *y;
+ ((T *) &s.d)[0] = *x;
+ return _mm_cmpeq_epi16 (s.d, *z);
+}