Blame SOURCES/gcc9-pr90756.patch

d0de29
2019-07-04  Jakub Jelinek  <jakub@redhat.com>
d0de29
d0de29
	PR rtl-optimization/90756
d0de29
	* explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it
d0de29
	for VECTOR_TYPE_P.
d0de29
d0de29
--- gcc/explow.c
d0de29
+++ gcc/explow.c
d0de29
@@ -892,16 +892,7 @@ promote_ssa_mode (const_tree name, int *punsignedp)
d0de29
 
d0de29
   tree type = TREE_TYPE (name);
d0de29
   int unsignedp = TYPE_UNSIGNED (type);
d0de29
-  machine_mode mode = TYPE_MODE (type);
d0de29
-
d0de29
-  /* Bypass TYPE_MODE when it maps vector modes to BLKmode.  */
d0de29
-  if (mode == BLKmode)
d0de29
-    {
d0de29
-      gcc_assert (VECTOR_TYPE_P (type));
d0de29
-      mode = type->type_common.mode;
d0de29
-    }
d0de29
-
d0de29
-  machine_mode pmode = promote_mode (type, mode, &unsignedp);
d0de29
+  machine_mode pmode = promote_mode (type, TYPE_MODE (type), &unsignedp);
d0de29
   if (punsignedp)
d0de29
     *punsignedp = unsignedp;
d0de29
 
d0de29
--- /dev/null
d0de29
+++ gcc/testsuite/gcc.dg/pr90756.c
d0de29
@@ -0,0 +1,26 @@
d0de29
+/* PR rtl-optimization/90756 */
d0de29
+/* { dg-do compile } */
d0de29
+/* { dg-options "-O2 -Wno-psabi" } */
d0de29
+/* { dg-additional-options "-mno-sse" { target ia32 } } */
d0de29
+
d0de29
+typedef float B __attribute__((vector_size(4 * sizeof (float))));
d0de29
+typedef unsigned long long C __attribute__((vector_size(4 * sizeof (long long))));
d0de29
+typedef short D __attribute__((vector_size(4 * sizeof (short))));
d0de29
+B z;
d0de29
+void foo (C);
d0de29
+C bar (D);
d0de29
+B baz ();
d0de29
+D qux (B);
d0de29
+
d0de29
+void
d0de29
+quux (int x)
d0de29
+{
d0de29
+  B n = z, b = z;
d0de29
+  while (1)
d0de29
+    switch (x)
d0de29
+      {
d0de29
+      case 0: n = baz (); /* FALLTHRU */
d0de29
+      case 1: { B o = n; n = b; b = o; } /* FALLTHRU */
d0de29
+      case 2: { D u = qux (b); C v = bar (u); foo (v); }
d0de29
+      }
d0de29
+}