[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