re PR middle-end/55359 (ICE in simplify_subreg accessing an unaligned subvector)
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 19 Nov 2012 23:28:04 +0000 (23:28 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 19 Nov 2012 23:28:04 +0000 (23:28 +0000)
gcc/
PR middle-end/55359
* simplify-rtx.c (simplify_subreg): Return null for invalid offsets.

gcc/testsuite/
* gcc.target/i386/pr55359.c: New test.

From-SVN: r193640

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr55359.c [new file with mode: 0644]

index 46d471f0ff40be2de6e3b5edd6d50399640dfbea..dcb56bcfa9e8bcc76302de4671228eacd979dd00 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-19  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR middle-end/55359
+       * simplify-rtx.c (simplify_subreg): Return null for invalid offsets.
+
 2012-11-19  Aldy Hernandez  <aldyh@redhat.com>
 
        * trans-mem.c (execute_tm_mark): Release bb_regions.
index 18223a89f4a14bb44544d2095c3bba4b7164357c..46d9e8a1ede4df07a28bc3f4475c848160f7cc05 100644 (file)
@@ -5685,8 +5685,11 @@ simplify_subreg (enum machine_mode outermode, rtx op,
   gcc_assert (GET_MODE (op) == innermode
              || GET_MODE (op) == VOIDmode);
 
-  gcc_assert ((byte % GET_MODE_SIZE (outermode)) == 0);
-  gcc_assert (byte < GET_MODE_SIZE (innermode));
+  if ((byte % GET_MODE_SIZE (outermode)) != 0)
+    return NULL_RTX;
+
+  if (byte >= GET_MODE_SIZE (innermode))
+    return NULL_RTX;
 
   if (outermode == innermode && !byte)
     return op;
index e5bafaa78250b8f60f9c0cee5715bf25db821fa0..514809970d6591fe3221039e70cd47f8b0420a7d 100644 (file)
@@ -1,3 +1,7 @@
+2012-11-19  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gcc.target/i386/pr55359.c: New test.
+
 2012-11-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * g++.dg/tls/thread_local-order1.C: Add dg-require-cxa-atexit.
diff --git a/gcc/testsuite/gcc.target/i386/pr55359.c b/gcc/testsuite/gcc.target/i386/pr55359.c
new file mode 100644 (file)
index 0000000..222affc
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx2 -O2" } */
+
+#include <x86intrin.h>
+
+__m128d
+f (__m256d x)
+{
+  return *((__m128d*) ((double *) &x + 1));
+}