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;
          }
 

Reply via email to