]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR middle-end/70355
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Mar 2016 15:19:00 +0000 (15:19 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Mar 2016 15:19:00 +0000 (15:19 +0000)
  * lower-subreg.c (simplify_subreg_concatn): Reject paradoxical subregs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234524 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lower-subreg.c
gcc/testsuite/gcc.c-torture/compile/pr70355.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr70355.c [new file with mode: 0644]

index decdd7111fe72b3005f6260f5a2f79ca22a396ce..7617d4acc9c7705ac22cfc8f998c3eeff1dd2d3d 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-29  Richard Henderson  <rth@redhat.com>
+
+       PR middle-end/70355
+       * lower-subreg.c (simplify_subreg_concatn): Reject paradoxical
+       subregs.
+
 2016-03-29  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70424
index 5432d0597c5c2d7c3512b0484ae66103afddbb4d..f7b3ac4170ec28e60ba3bcfb26b791277326bd25 100644 (file)
@@ -614,7 +614,8 @@ simplify_subreg_concatn (machine_mode outermode, rtx op,
 
   innermode = GET_MODE (op);
   gcc_assert (byte < GET_MODE_SIZE (innermode));
-  gcc_assert (GET_MODE_SIZE (outermode) <= GET_MODE_SIZE (innermode));
+  if (GET_MODE_SIZE (outermode) > GET_MODE_SIZE (innermode))
+    return NULL_RTX;
 
   inner_size = GET_MODE_SIZE (innermode) / XVECLEN (op, 0);
   part = XVECEXP (op, 0, byte / inner_size);
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr70355.c b/gcc/testsuite/gcc.c-torture/compile/pr70355.c
new file mode 100644 (file)
index 0000000..4749427
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target int128 } */
+/* { dg-additional-options "-g" } */
+
+typedef unsigned __int128 v2ti __attribute__ ((vector_size (32)));
+
+unsigned
+foo (unsigned i, v2ti v)
+{
+  do {
+    i--;
+    v %= ~v;
+  } while (i);
+  return v[0] + v[1];
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr70355.c b/gcc/testsuite/gcc.target/i386/pr70355.c
new file mode 100644 (file)
index 0000000..b55f6fc
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target int128 } */
+/* { dg-options "-O2 -fno-tree-ter -funroll-loops -mavx512f -g" } */
+
+typedef unsigned __int128 v2ti __attribute__ ((vector_size (32)));
+
+unsigned
+foo (unsigned i, v2ti v)
+{
+  do {
+    i--;
+    v %= ~v;
+  } while (i);
+  return v[0] + v[1];
+}