From: Andrew Stubbs Date: Wed, 1 Jul 2026 14:36:55 +0000 (+0000) Subject: regrename: Handle MEM segments X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cfc8ba7fa91eb7bf12fb7cd01542ddee2c337fb0;p=thirdparty%2Fgcc.git regrename: Handle MEM segments 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. --- diff --git a/gcc/regrename.cc b/gcc/regrename.cc index 5b625cd27df..07c3659f8a8 100644 --- a/gcc/regrename.cc +++ b/gcc/regrename.cc @@ -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);