The recent refactoring of the dot_prod optab to convert-type exposed a
limitation in how `find_widening_optab_handler_and_mode' is currently
implemented, owing to the fact that, while the function expects the
GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
condition to hold, the c6x backend implements a dot product from V2HI
to SI, which triggers an ICE.
Consequently, this patch adds some logic to allow widening optabs
which accumulate vector elements to a single scalar.
gcc/ChangeLog:
PR middle-end/116926
* optabs-query.cc (find_widening_optab_handler_and_mode): Add
handling of vector -> scalar optab handling.
if (GET_MODE_CLASS (limit_mode) == MODE_PARTIAL_INT)
limit_mode = GET_MODE_WIDER_MODE (limit_mode).require ();
}
+ else if (is_a <scalar_int_mode> (to_mode))
+ {
+ gcc_checking_assert (VECTOR_MODE_P (from_mode)
+ && GET_MODE_INNER (from_mode) < to_mode);
+ limit_mode = from_mode;
+ }
else
gcc_checking_assert (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
&& from_mode < to_mode);