https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107985
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2022-12-06 --- Comment #2 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- The dispatch code in range_op_handler::fold_range() is ICEing because LHS is an irange, whereas op1 is an unsupported type: (gdb) p debug(r) [irange] UNDEFINED (gdb) p debug(lh) [unsupported_range] UNDEFINED Going up to range_of_range_op we see: (gdb) up #3 0x0000000002ec054f in fold_using_range::range_of_range_op (this=0x7fffffffcb7f, r=warning: RTTI symbol not found for class 'int_range<255u>' ..., handler=..., src=...) at /home/aldyh/src/gcc/gcc/gimple-range-fold.cc:565 (gdb) p debug(s) pfd.0_1 = (sizetype) pfb_5; (gdb) p debug_tree(lhs) <ssa_name 0x7fffe9fc40d8 type <integer_type 0x7fffe9e26000 sizetype public unsigned DI size <integer_cst 0x7fffe9e02fc0 constant 64> unit-size <integer_cst 0x7fffe9e02fd8 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7fffe9e26000 precision:64 min <integer_cst 0x7fffe9e28000 0> max <integer_cst 0x7fffe9e035e0 18446744073709551615>> visited def_stmt pfd.0_1 = (sizetype) pfb_5; version:1> $7 = void (gdb) p debug_tree(op1) <ssa_name 0x7fffe9fc41f8 type <offset_type 0x7fffe9fca150 type <integer_type 0x7fffe9e265e8 int sizes-gimplified public type_6 SI size <integer_cst 0x7fffe9e28210 constant 32> unit-size <integer_cst 0x7fffe9e28228 constant 4> align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7fffe9e265e8 precision:32 min <integer_cst 0x7fffe9e281c8 -2147483648> max <integer_cst 0x7fffe9e281e0 2147483647> pointer_to_this <pointer_type 0x7fffe9e2eb28>> sizes-gimplified public DI size <integer_cst 0x7fffe9e02fc0 constant 64> unit-size <integer_cst 0x7fffe9e02fd8 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7fffe9fca150 basetype <record_type 0x7fffe9fae7e0 B>> visited var <var_decl 0x7fffe9e11d80 pfb> def_stmt pfb_5 = 0; version:5> $8 = void So we're trying to cast from an offset_type (unsupported) to an integer_type (irange). It looks like range_op_handler should have set m_valid to false for this combination, but m_valid is set from set_op_handler() which only looks at the LHS.