Hi, as the bug trail explains make_extraction is claiming but failing to handle extractions that would go outside the underlying object. So, let's not construct such, as the patch does.
Dominik tested s390x bootstrap being recovered with this, Andreas ia64 bootstrap, and I regstrapped this on x86-64-linux without regressions (all langs+ada). Okay for trunk? Ciao, Michael. PR bootstrap/78390 * combine.c (make_compound_operation_int): Don't extract from outside underlying object. diff --git a/gcc/combine.c b/gcc/combine.c index 0210685..1d8bddf 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -8108,9 +8108,16 @@ make_compound_operation (rtx x, enum rtx_code in_code) && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner)) && subreg_lowpart_p (x)) { + int len = mode_width; new_rtx = make_compound_operation (XEXP (inner, 0), next_code); + /* Don't extract bits outside the underlying mode. */ + if (CONST_INT_P (XEXP (inner, 1)) + && (INTVAL (XEXP (inner, 1)) + len + > GET_MODE_PRECISION (GET_MODE (new_rtx)))) + len = GET_MODE_PRECISION (GET_MODE (new_rtx)) + - INTVAL (XEXP (inner, 1)); new_rtx = make_extraction (mode, new_rtx, 0, XEXP (inner, 1), - mode_width, 1, 0, in_code == COMPARE); + len, 1, 0, in_code == COMPARE); break; }