[clang] [llvm] [AArch64][SME] Save VG for unwind info when changing streaming-mode (PR #83301)

Kerry McLaughlin via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 3 09:48:51 PDT 2024


================
@@ -1552,6 +1553,57 @@ bool AArch64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
    case AArch64::COALESCER_BARRIER_FPR128:
      MI.eraseFromParent();
      return true;
+   case AArch64::VGSavePseudo:
+   case AArch64::VGRestorePseudo: {
+     MachineFunction &MF = *MBB.getParent();
+     SMEAttrs FuncAttrs(MF.getFunction());
+     bool LocallyStreaming =
+         FuncAttrs.hasStreamingBody() && !FuncAttrs.hasStreamingInterface();
+     const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
+
+     if (!AFI->requiresVGSpill(MF))
+       return false;
+
+     int64_t VGFrameIdx =
+         LocallyStreaming ? AFI->getStreamingVGIdx() : AFI->getVGIdx();
+     assert(VGFrameIdx != std::numeric_limits<int>::max() &&
+            "Expected FrameIdx for VG");
+
+     const TargetSubtargetInfo &STI = MF.getSubtarget();
+     const TargetInstrInfo &TII = *STI.getInstrInfo();
+     const TargetRegisterInfo &TRI = *STI.getRegisterInfo();
+
+     if (Opcode == AArch64::VGSavePseudo) {
+       // This pseudo has been inserted after a streaming-mode change
+       // to save the streaming value of VG before a call.
+       // Calculate and emit the CFI offset using VGFrameIdx.
+       MachineFrameInfo &MFI = MF.getFrameInfo();
+       const AArch64FrameLowering *TFI =
+           MF.getSubtarget<AArch64Subtarget>().getFrameLowering();
+
+       int64_t Offset =
+           MFI.getObjectOffset(VGFrameIdx) - TFI->getOffsetOfLocalArea();
+       unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
+           nullptr, TRI.getDwarfRegNum(AArch64::VG, true), Offset));
+       BuildMI(MBB, MBBI, MBBI->getDebugLoc(),
+               TII.get(TargetOpcode::CFI_INSTRUCTION))
+           .addCFIIndex(CFIIndex)
+           .setMIFlags(MachineInstr::FrameSetup);
+     } else {
+       // This is a restore of VG after returning from the call. Emit the
+       // .cfi_restore instruction, which sets the rule for VG to the same
+       // as it was on entry to the function.
+       ++MBBI;
----------------
kmclaughlin-arm wrote:

This was a mistake, the iterator shouldn't be changing here as the pseudos are emitted in the correct place around the call.

https://github.com/llvm/llvm-project/pull/83301


More information about the cfe-commits mailing list