[llvm] [AArch64] Unfold adds when eliminating frame index with scalable offset (PR #158597)
Sander de Smalen via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 16 03:19:30 PDT 2025
================
@@ -6564,35 +6564,67 @@ int llvm::isAArch64FrameOffsetLegal(const MachineInstr &MI,
(SOffset ? 0 : AArch64FrameOffsetIsLegal);
}
+// Unfold ADDSXri:
+// adds %dest, %stack, c
+// -->
+// add %dest, %stack, 0
+// adds %dest, %dest, c
+static MachineInstr *unfoldAddSXri(MachineInstr &MI, unsigned FrameReg,
+ const AArch64InstrInfo *TII) {
+ auto *MBB = MI.getParent();
+ Register DestReg = MI.getOperand(0).getReg();
+
+ auto *Unfolded =
+ BuildMI(*MBB, MI, MI.getDebugLoc(), TII->get(AArch64::ADDXri), DestReg)
+ .addReg(FrameReg)
+ .addImm(0)
+ .addImm(0)
+ .getInstr();
+
+ BuildMI(*MBB, MI, MI.getDebugLoc(), TII->get(AArch64::ADDSXri), DestReg)
+ .addReg(DestReg)
+ .addImm(MI.getOperand(2).getImm())
+ .addImm(MI.getOperand(3).getImm());
+
+ MI.eraseFromParent();
+ return Unfolded;
+}
+
bool llvm::rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
unsigned FrameReg, StackOffset &Offset,
const AArch64InstrInfo *TII) {
unsigned Opcode = MI.getOpcode();
unsigned ImmIdx = FrameRegIdx + 1;
+ MachineInstr *NewMI = &MI;
+ if (Opcode == AArch64::ADDSXri && Offset.getScalable()) {
----------------
sdesmalen-arm wrote:
Rather than unfolding it separately here, I'd rather the code in `emitFrameOffset` would simply add an additional `ADDSXri/SUBSXri` of the result register with an immediate 0 to set the flags at the end.
https://github.com/llvm/llvm-project/pull/158597
More information about the llvm-commits
mailing list