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

--- Comment #4 from Drea Pinski <pinskia at gcc dot gnu.org> ---
This patch fixes the issue for me (I need to check other things still):
```
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index 207a7dcf944..6f8d0769fd1 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -3652,6 +3652,7 @@ build_mul_high_seq (tree op1, tree op2, tree dest,
location_t loc,
 {
   tree op_type = TREE_TYPE (op1);
   unsigned int width = TYPE_PRECISION (op_type);
+  gcc_assert (width * 2 <= MAX_FIXED_MODE_SIZE);
   tree wide_type = build_nonstandard_integer_type (width * 2, 1);

   tree wide_a = gimple_convert (seq, loc, wide_type, op1);
@@ -4534,16 +4535,15 @@ long_mul_classify_match (const vec<long_mul_summand>
&summands,
      consumes -- either via WIDEN_MULT_EXPR / MULT_HIGHPART conversion when
      the target has a native 2N multiply, or via lower_long_mul_high_chain
      when it does not.  LOW_PART rows emit a plain MULT_EXPR.  Emission
-     needs a 2N mode to exist in the mode table AND the widening_mul pass
-     to be active: without the pass, the emit could reach RTL expand as an
-     unexpandable 2N multiply (e.g. OImode).  BITINT_TYPE is
+     needs a 2N mode to exist and supported by the target.  BITINT_TYPE is
      refused -- the long_mul_high_chain atom excludes it.  */
   scalar_int_mode mode, wide_mode;
   bool can_emit_high
     = optimize_widening_mul_active_p ()
       && TREE_CODE (lhs_type) != BITINT_TYPE
       && is_a <scalar_int_mode> (TYPE_MODE (lhs_type), &mode)
-      && GET_MODE_2XWIDER_MODE (mode).exists (&wide_mode);
+      && GET_MODE_2XWIDER_MODE (mode).exists (&wide_mode)
+      && targetm.scalar_mode_supported_p (wide_mode);

   for (const long_mul_row &row : long_mul_table)
     {

```

Reply via email to