re PR rtl-optimization/90756 (g++ ICE in convert_move, at expr.c:218 on i686 and...
authorJakub Jelinek <jakub@redhat.com>
Thu, 4 Jul 2019 04:49:22 +0000 (06:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 4 Jul 2019 04:49:22 +0000 (06:49 +0200)
PR rtl-optimization/90756
* explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it
for VECTOR_TYPE_P.

* gcc.dg/pr90756.c: New test.

From-SVN: r273036

gcc/ChangeLog
gcc/explow.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr90756.c [new file with mode: 0644]

index 2d6758d..2cfc446 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/90756
+       * explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it
+       for VECTOR_TYPE_P.
+
 2019-07-03  Dennis Zhang  <dennis.zhang@arm.com>
 
        * config/aarch64/aarch64.md: Remove redundant constraints from
index ba06458..aea7118 100644 (file)
@@ -892,16 +892,7 @@ promote_ssa_mode (const_tree name, int *punsignedp)
 
   tree type = TREE_TYPE (name);
   int unsignedp = TYPE_UNSIGNED (type);
-  machine_mode mode = TYPE_MODE (type);
-
-  /* Bypass TYPE_MODE when it maps vector modes to BLKmode.  */
-  if (mode == BLKmode)
-    {
-      gcc_assert (VECTOR_TYPE_P (type));
-      mode = type->type_common.mode;
-    }
-
-  machine_mode pmode = promote_mode (type, mode, &unsignedp);
+  machine_mode pmode = promote_mode (type, TYPE_MODE (type), &unsignedp);
   if (punsignedp)
     *punsignedp = unsignedp;
 
index aa00f0b..66045e5 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/90756
+       * gcc.dg/pr90756.c: New test.
+
 2019-07-04  Chenghua Xu  <paul.hua.gm@gmail.com>
 
        * gcc.target/mips/mips-fmadd.c: Rename to ...
diff --git a/gcc/testsuite/gcc.dg/pr90756.c b/gcc/testsuite/gcc.dg/pr90756.c
new file mode 100644 (file)
index 0000000..3507aa2
--- /dev/null
@@ -0,0 +1,26 @@
+/* PR rtl-optimization/90756 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wno-psabi" } */
+/* { dg-additional-options "-mno-sse" { target ia32 } } */
+
+typedef float B __attribute__((vector_size(4 * sizeof (float))));
+typedef unsigned long long C __attribute__((vector_size(4 * sizeof (long long))));
+typedef short D __attribute__((vector_size(4 * sizeof (short))));
+B z;
+void foo (C);
+C bar (D);
+B baz ();
+D qux (B);
+
+void
+quux (int x)
+{
+  B n = z, b = z;
+  while (1)
+    switch (x)
+      {
+      case 0: n = baz (); /* FALLTHRU */
+      case 1: { B o = n; n = b; b = o; } /* FALLTHRU */
+      case 2: { D u = qux (b); C v = bar (u); foo (v); }
+      }
+}