https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114801

--- Comment #29 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
With
--- a/gcc/config/arm/arm-mve-builtins.cc
+++ b/gcc/config/arm/arm-mve-builtins.cc
@@ -2100,7 +2100,22 @@ function_expander::add_input_operand (insn_code icode,
rtx x)
       mode = GET_MODE (x);
     }
   else if (VALID_MVE_PRED_MODE (mode))
-    x = gen_lowpart (mode, x);
+    {
+      if (CONST_INT_P (x) && (mode == V8BImode || mode == V4BImode))
+       {
+         /* In V8BI or V4BI each element has 2 or 4 bits, if those
+            bits aren't all the same, gen_lowpart might ICE.  */
+         unsigned HOST_WIDE_INT xi = UINTVAL (x);
+         if ((xi & 0x5555) != ((xi >> 1) & 0x5555)
+             || (mode == V4BImode
+                 && (xi & 0x3333) != ((xi >> 2) & 0x3333)))
+           x = force_reg (HImode, x);
+       }
+      else if (SUBREG_P (x))
+       /* gen_lowpart on a SUBREG can ICE.  */
+       x = force_reg (GET_MODE (x), x);
+      x = gen_lowpart (mode, x);
+    }

   m_ops.safe_grow (m_ops.length () + 1, true);
   create_input_operand (&m_ops.last (), x, mode);

Reply via email to