[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