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]>
---
 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 bb67dca560b..cd3fd2fc8fb 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;
-- 
2.43.0

Reply via email to