[gcc r14-12364] widen mult: Fix handling of _Fract mixed with _Fract [PR119568]
Andrew Pinski
pinskia@gcc.gnu.org
Sat Mar 14 03:44:11 GMT 2026
https://gcc.gnu.org/g:6022ed97deb94ad1818f73727fec193148fd6f7c
commit r14-12364-g6022ed97deb94ad1818f73727fec193148fd6f7c
Author: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
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 <andrew.pinski@oss.qualcomm.com>
(cherry picked from commit 4ef3d71a08aa167a5b73bc073cdfb1a6784e5de7)
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 72cb240bc059..81b85adc7063 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -3038,6 +3038,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;
More information about the Gcc-cvs
mailing list