[llvm] ac6878b - [X86] Set frame-setup/frame-destroy on prologue/epilogue CFI instructions

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 31 23:04:56 PDT 2022


Author: Fangrui Song
Date: 2022-03-31T23:04:50-07:00
New Revision: ac6878b330f3dfb4a7e99093dfdd9d88bacead28

URL: https://github.com/llvm/llvm-project/commit/ac6878b330f3dfb4a7e99093dfdd9d88bacead28
DIFF: https://github.com/llvm/llvm-project/commit/ac6878b330f3dfb4a7e99093dfdd9d88bacead28.diff

LOG: [X86] Set frame-setup/frame-destroy on prologue/epilogue CFI instructions

This approach is used by AArch64/RISCV to make frame-setup/frame-destroy
instructions contiguous instead of being interleaved by CFI instructions. Code
checking `MBBI->getFlag(MachineInstr::FrameSetup) || MBBI->isCFIInstruction()`
can be simplified to just check FrameSetup.

This helps locate all CFI instructions in the prologue, which can be handy to use
.cfi_remember_state/.cfi_restore_state to decrease unwind table size (D114545).

Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D122541

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86FrameLowering.cpp
    llvm/lib/Target/X86/X86FrameLowering.h
    llvm/test/CodeGen/X86/cfi-xmm.ll
    llvm/test/CodeGen/X86/epilogue-cfi-fp.ll
    llvm/test/CodeGen/X86/push-cfi.ll
    llvm/test/CodeGen/X86/throws-cfi-fp.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 1d0e1e67d4909..fe72f79e25320 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -437,11 +437,13 @@ int X86FrameLowering::mergeSPUpdates(MachineBasicBlock &MBB,
 void X86FrameLowering::BuildCFI(MachineBasicBlock &MBB,
                                 MachineBasicBlock::iterator MBBI,
                                 const DebugLoc &DL,
-                                const MCCFIInstruction &CFIInst) const {
+                                const MCCFIInstruction &CFIInst,
+                                MachineInstr::MIFlag Flag) const {
   MachineFunction &MF = *MBB.getParent();
   unsigned CFIIndex = MF.addFrameInst(CFIInst);
   BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
-      .addCFIIndex(CFIIndex);
+      .addCFIIndex(CFIIndex)
+      .setMIFlag(Flag);
 }
 
 /// Emits Dwarf Info specifying offsets of callee saved registers and
@@ -1660,12 +1662,15 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
       // Define the current CFA rule to use the provided offset.
       assert(StackSize);
       BuildCFI(MBB, MBBI, DL,
-               MCCFIInstruction::cfiDefCfaOffset(nullptr, -2 * stackGrowth));
+               MCCFIInstruction::cfiDefCfaOffset(nullptr, -2 * stackGrowth),
+               MachineInstr::FrameSetup);
 
       // Change the rule for the FramePtr to be an "offset" rule.
       unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true);
-      BuildCFI(MBB, MBBI, DL, MCCFIInstruction::createOffset(
-                                  nullptr, DwarfFramePtr, 2 * stackGrowth));
+      BuildCFI(MBB, MBBI, DL,
+               MCCFIInstruction::createOffset(nullptr, DwarfFramePtr,
+                                              2 * stackGrowth),
+               MachineInstr::FrameSetup);
     }
 
     if (NeedsWinCFI) {
@@ -1732,7 +1737,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
           unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true);
           BuildCFI(
               MBB, MBBI, DL,
-              MCCFIInstruction::createDefCfaRegister(nullptr, DwarfFramePtr));
+              MCCFIInstruction::createDefCfaRegister(nullptr, DwarfFramePtr),
+              MachineInstr::FrameSetup);
         }
 
         if (NeedsWinFPO) {
@@ -1783,7 +1789,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
       // Define the current CFA rule to use the provided offset.
       assert(StackSize);
       BuildCFI(MBB, MBBI, DL,
-               MCCFIInstruction::cfiDefCfaOffset(nullptr, -StackOffset));
+               MCCFIInstruction::cfiDefCfaOffset(nullptr, -StackOffset),
+               MachineInstr::FrameSetup);
       StackOffset += stackGrowth;
     }
 
@@ -2064,7 +2071,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
       assert(StackSize);
       BuildCFI(
           MBB, MBBI, DL,
-          MCCFIInstruction::cfiDefCfaOffset(nullptr, StackSize - stackGrowth));
+          MCCFIInstruction::cfiDefCfaOffset(nullptr, StackSize - stackGrowth),
+          MachineInstr::FrameSetup);
     }
 
     // Emit DWARF info specifying the offsets of the callee-saved registers.
@@ -2247,11 +2255,13 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
       unsigned DwarfStackPtr =
           TRI->getDwarfRegNum(Is64Bit ? X86::RSP : X86::ESP, true);
       BuildCFI(MBB, MBBI, DL,
-               MCCFIInstruction::cfiDefCfa(nullptr, DwarfStackPtr, SlotSize));
+               MCCFIInstruction::cfiDefCfa(nullptr, DwarfStackPtr, SlotSize),
+               MachineInstr::FrameDestroy);
       if (!MBB.succ_empty() && !MBB.isReturnBlock()) {
         unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true);
         BuildCFI(MBB, AfterPop, DL,
-                 MCCFIInstruction::createRestore(nullptr, DwarfFramePtr));
+                 MCCFIInstruction::createRestore(nullptr, DwarfFramePtr),
+                 MachineInstr::FrameDestroy);
         --MBBI;
         --AfterPop;
       }
@@ -2328,7 +2338,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
       // Define the current CFA rule to use the provided offset.
       BuildCFI(MBB, MBBI, DL,
                MCCFIInstruction::cfiDefCfaOffset(
-                   nullptr, CSSize + TailCallArgReserveSize + SlotSize));
+                   nullptr, CSSize + TailCallArgReserveSize + SlotSize),
+               MachineInstr::FrameDestroy);
     }
     --MBBI;
   }
@@ -2354,7 +2365,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
       if (Opc == X86::POP32r || Opc == X86::POP64r) {
         Offset += SlotSize;
         BuildCFI(MBB, MBBI, DL,
-                 MCCFIInstruction::cfiDefCfaOffset(nullptr, -Offset));
+                 MCCFIInstruction::cfiDefCfaOffset(nullptr, -Offset),
+                 MachineInstr::FrameDestroy);
       }
     }
   }

diff  --git a/llvm/lib/Target/X86/X86FrameLowering.h b/llvm/lib/Target/X86/X86FrameLowering.h
index 43651acf077ae..9b83fe77d5059 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.h
+++ b/llvm/lib/Target/X86/X86FrameLowering.h
@@ -176,7 +176,8 @@ class X86FrameLowering : public TargetFrameLowering {
 
   /// Wraps up getting a CFI index and building a MachineInstr for it.
   void BuildCFI(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
-                const DebugLoc &DL, const MCCFIInstruction &CFIInst) const;
+                const DebugLoc &DL, const MCCFIInstruction &CFIInst,
+                MachineInstr::MIFlag Flag = MachineInstr::NoFlags) const;
 
   /// Sets up EBP and optionally ESI based on the incoming EBP value.  Only
   /// needed for 32-bit. Used in funclet prologues and at catchret destinations.

diff  --git a/llvm/test/CodeGen/X86/cfi-xmm.ll b/llvm/test/CodeGen/X86/cfi-xmm.ll
index e98f71d49366e..36cf95fc28c25 100644
--- a/llvm/test/CodeGen/X86/cfi-xmm.ll
+++ b/llvm/test/CodeGen/X86/cfi-xmm.ll
@@ -25,7 +25,7 @@ entry:
 ; PEI:         $rsp = frame-setup SUB64ri8 $rsp, 40, implicit-def dead $eflags
 ; PEI-NEXT:    frame-setup MOVAPSmr $rsp, 1, $noreg, 16, $noreg, killed $xmm15 :: (store (s128) into %fixed-stack.1)
 ; PEI-NEXT:    frame-setup MOVAPSmr $rsp, 1, $noreg, 0, $noreg, killed $xmm10 :: (store (s128) into %fixed-stack.0)
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION def_cfa_offset 48
+; PEI-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 48
 ; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION offset $xmm10, -48
 ; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION offset $xmm15, -32
 ; PEI-NEXT:    INLINEASM {{.*}}

diff  --git a/llvm/test/CodeGen/X86/epilogue-cfi-fp.ll b/llvm/test/CodeGen/X86/epilogue-cfi-fp.ll
index 930b3537d4378..4cca21fe4adab 100644
--- a/llvm/test/CodeGen/X86/epilogue-cfi-fp.ll
+++ b/llvm/test/CodeGen/X86/epilogue-cfi-fp.ll
@@ -15,7 +15,7 @@ define i32 @foo(i32 %i, i32 %j, i32 %k, i32 %l, i32 %m) #0 {
 
 ; PEI-LABEL: name: foo
 ; PEI:         $ebp = frame-destroy POP32r implicit-def $esp, implicit $esp
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION def_cfa $esp, 4
+; PEI-NEXT:    frame-destroy CFI_INSTRUCTION def_cfa $esp, 4
 ; PEI-NEXT:    RET 0, killed $eax
 
 entry:

diff  --git a/llvm/test/CodeGen/X86/push-cfi.ll b/llvm/test/CodeGen/X86/push-cfi.ll
index 670975e7c2212..a3fab380d045f 100644
--- a/llvm/test/CodeGen/X86/push-cfi.ll
+++ b/llvm/test/CodeGen/X86/push-cfi.ll
@@ -29,7 +29,7 @@ declare void @empty()
 
 ; PEI-LABEL: name: test1_nofp
 ; PEI:         $esp = frame-setup SUB32ri8 $esp, 12, implicit-def dead $eflags
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION def_cfa_offset 16
+; PEI-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 16
 ; PEI-NOT:     frame-setup CFI_INSTRUCTION
 ; PEI:         ...
 define void @test1_nofp() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {

diff  --git a/llvm/test/CodeGen/X86/throws-cfi-fp.ll b/llvm/test/CodeGen/X86/throws-cfi-fp.ll
index 9a73b40ef9dd1..870b661568005 100644
--- a/llvm/test/CodeGen/X86/throws-cfi-fp.ll
+++ b/llvm/test/CodeGen/X86/throws-cfi-fp.ll
@@ -22,10 +22,10 @@ define void @_Z6throwsv() #0 personality i8* bitcast (i32 (...)* @__gxx_personal
 
 ; PEI-LABEL: name: _Z6throwsv
 ; PEI:         frame-setup PUSH64r killed $rbp, implicit-def $rsp, implicit $rsp
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION def_cfa_offset 16
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION offset $rbp, -16
+; PEI-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 16
+; PEI-NEXT:    frame-setup CFI_INSTRUCTION offset $rbp, -16
 ; PEI-NEXT:    $rbp = frame-setup MOV64rr $rsp
-; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION def_cfa_register $rbp
+; PEI-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_register $rbp
 ; PEI-NEXT:    frame-setup PUSH64r killed $rbx, implicit-def $rsp, implicit $rsp
 ; PEI-NEXT:    frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
 ; PEI-NEXT:    {{^ +}}CFI_INSTRUCTION offset $rbx, -24
@@ -33,7 +33,7 @@ define void @_Z6throwsv() #0 personality i8* bitcast (i32 (...)* @__gxx_personal
 ; PEI-NEXT:      $rsp = frame-destroy ADD64ri8 $rsp, 8, implicit-def dead $eflags
 ; PEI-NEXT:      $rbx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
 ; PEI-NEXT:      $rbp = frame-destroy POP64r implicit-def $rsp, implicit $rsp
-; PEI-NEXT:      {{^ +}}CFI_INSTRUCTION def_cfa $rsp, 8
+; PEI-NEXT:      frame-destroy CFI_INSTRUCTION def_cfa $rsp, 8
 ; PEI-NEXT:      RET 0
 
 entry:


        


More information about the llvm-commits mailing list