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;

Reply via email to