]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
regrename: Handle MEM segments
authorAndrew Stubbs <ams@baylibre.com>
Wed, 1 Jul 2026 14:36:55 +0000 (14:36 +0000)
committerAndrew Stubbs <ams@baylibre.com>
Wed, 15 Jul 2026 11:15:49 +0000 (11:15 +0000)
This patch fixes the register rename pass to allow for MEM that have "segment"
elements in the address.

rtl.h and rtanal.h allow MEM addresses to have the format "segment + base +
offset", where "segment" is an arbitrary UNSPEC.  Without the patch, regrename
misidentifies the base and can break 64-bit addresses, on targets with 32-bit
registers, by placing the high-part in a non-contiguous register.

gcc/ChangeLog:

* regrename.cc (scan_rtx_address): Recurse for segment UNSPECs.

gcc/regrename.cc

index 5b625cd27dffed53a37b6eec207c36e36fe7fd4e..07c3659f8a8c522d3865c69658a90d8f95a43d08 100644 (file)
@@ -1341,6 +1341,12 @@ scan_rtx_address (rtx_insn *insn, rtx *loc, enum reg_class cl,
        rtx *locB = NULL;
        enum rtx_code index_code = SCRATCH;
 
+       if (GET_CODE (op0) == UNSPEC)
+         {
+           /* We have a "segment" unspec; skip it.  */
+           return scan_rtx_address (insn, &XEXP (x, 1), cl, action, mode, as);
+         }
+
        if (GET_CODE (op0) == SUBREG)
          {
            op0 = SUBREG_REG (op0);