https://gcc.gnu.org/g:4ef3d71a08aa167a5b73bc073cdfb1a6784e5de7
commit r16-7894-g4ef3d71a08aa167a5b73bc073cdfb1a6784e5de7 Author: Andrew Pinski <[email protected]> Date: Tue Mar 3 13:57:47 2026 -0800 widen mult: Fix handling of _Fract mixed with _Fract [PR119568] The problem here is we try calling find_widening_optab_handler_and_mode with to_mode=E_USAmode and from_mode=E_UHQmode. This causes an ICE (with checking only). The fix is to reject the case where the mode classes are different in convert_plusminus_to_widen before even trying to deal with the modes. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/119568 gcc/ChangeLog: * tree-ssa-math-opts.cc (convert_plusminus_to_widen): Reject different mode classes. Signed-off-by: Andrew Pinski <[email protected]> Diff: --- gcc/tree-ssa-math-opts.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index bb67dca560b4..cd3fd2fc8fb4 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -2982,6 +2982,11 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple *stmt, if (to_mode == from_mode) return false; + /* For fixed point types, the mode classes could be different + so reject that case. */ + if (GET_MODE_CLASS (from_mode) != GET_MODE_CLASS (to_mode)) + return false; + from_unsigned1 = TYPE_UNSIGNED (type1); from_unsigned2 = TYPE_UNSIGNED (type2); optype = type1;
