https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87633
--- Comment #7 from Yury Gribov <ygribov at gcc dot gnu.org> --- Problem seems to be in extract_range_from_binary_expr_1, in /* Build the bounds. */ combine_bound (code, wmin, min_ovf, expr_type, min_op0, min_op1); min_op0 is NULL_TREE which causes set_value_range_with_overflow to generate invalid range which then ICEs. Simply adding && min_op0 && min_op1 && max_op0 && max_op1 to guarding condition works around the error but I guess you'll want a more clever fix. I'll try retesting without isl until it's fixed.