[llvm] r315000 - [X86] Simplify X86 epilogue frame size calculation, NFC
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 5 11:27:08 PDT 2017
Author: rnk
Date: Thu Oct 5 11:27:08 2017
New Revision: 315000
URL: http://llvm.org/viewvc/llvm-project?rev=315000&view=rev
Log:
[X86] Simplify X86 epilogue frame size calculation, NFC
Sink the insertion of "pop ebp" out of the frame size calculation
branches. They all check for HasFP.
Our handling of CLEANUPRET and CATCHRET was equivalent, both are
funclets and use the same frame size. We can eliminate the CLEANUPRET
case.
Hoist the hasFP(MF) query into a local bool.
Rename TargetMBB to CatchRetTarget to be more descriptive.
Eliminate the Optional<unsigned> RetOpcode local, now that it has one
use.
It's only a net savings of 10 lines, but hopefully it's *slightly* more
readable.
Modified:
llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=315000&r1=314999&r2=315000&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Thu Oct 5 11:27:08 2017
@@ -1523,9 +1523,6 @@ void X86FrameLowering::emitEpilogue(Mach
const MachineFrameInfo &MFI = MF.getFrameInfo();
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
- Optional<unsigned> RetOpcode;
- if (MBBI != MBB.end())
- RetOpcode = MBBI->getOpcode();
DebugLoc DL;
if (MBBI != MBB.end())
DL = MBBI->getDebugLoc();
@@ -1539,35 +1536,26 @@ void X86FrameLowering::emitEpilogue(Mach
bool NeedsWinCFI =
IsWin64Prologue && MF.getFunction()->needsUnwindTableEntry();
bool IsFunclet = MBBI == MBB.end() ? false : isFuncletReturnInstr(*MBBI);
- MachineBasicBlock *TargetMBB = nullptr;
+ MachineBasicBlock *CatchRetTarget = nullptr;
// Get the number of bytes to allocate from the FrameInfo.
uint64_t StackSize = MFI.getStackSize();
uint64_t MaxAlign = calculateMaxStackAlign(MF);
unsigned CSSize = X86FI->getCalleeSavedFrameSize();
+ bool HasFP = hasFP(MF);
uint64_t NumBytes = 0;
- if (RetOpcode && *RetOpcode == X86::CATCHRET) {
- // SEH shouldn't use catchret.
- assert(!isAsynchronousEHPersonality(
- classifyEHPersonality(MF.getFunction()->getPersonalityFn())) &&
- "SEH should not use CATCHRET");
-
+ if (IsFunclet) {
+ assert(HasFP && "EH funclets without FP not yet implemented");
NumBytes = getWinEHFuncletFrameSize(MF);
- assert(hasFP(MF) && "EH funclets without FP not yet implemented");
- TargetMBB = MBBI->getOperand(0).getMBB();
-
- // Pop EBP.
- BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
- MachineFramePtr)
- .setMIFlag(MachineInstr::FrameDestroy);
- } else if (RetOpcode && *RetOpcode == X86::CLEANUPRET) {
- NumBytes = getWinEHFuncletFrameSize(MF);
- assert(hasFP(MF) && "EH funclets without FP not yet implemented");
- BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
- MachineFramePtr)
- .setMIFlag(MachineInstr::FrameDestroy);
- } else if (hasFP(MF)) {
+ if (MBBI->getOpcode() == X86::CATCHRET) {
+ // SEH shouldn't use catchret.
+ assert(!isAsynchronousEHPersonality(
+ classifyEHPersonality(MF.getFunction()->getPersonalityFn())) &&
+ "SEH should not use CATCHRET");
+ CatchRetTarget = MBBI->getOperand(0).getMBB();
+ }
+ } else if (HasFP) {
// Calculate required stack adjustment.
uint64_t FrameSize = StackSize - SlotSize;
NumBytes = FrameSize - CSSize;
@@ -1576,16 +1564,18 @@ void X86FrameLowering::emitEpilogue(Mach
// realigned.
if (TRI->needsStackRealignment(MF) && !IsWin64Prologue)
NumBytes = alignTo(FrameSize, MaxAlign);
-
- // Pop EBP.
- BuildMI(MBB, MBBI, DL,
- TII.get(Is64Bit ? X86::POP64r : X86::POP32r), MachineFramePtr)
- .setMIFlag(MachineInstr::FrameDestroy);
} else {
NumBytes = StackSize - CSSize;
}
uint64_t SEHStackAllocAmt = NumBytes;
+ if (HasFP) {
+ // Pop EBP.
+ BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),
+ MachineFramePtr)
+ .setMIFlag(MachineInstr::FrameDestroy);
+ }
+
MachineBasicBlock::iterator FirstCSPop = MBBI;
// Skip the callee-saved pop instructions.
while (MBBI != MBB.begin()) {
@@ -1603,25 +1593,25 @@ void X86FrameLowering::emitEpilogue(Mach
}
MBBI = FirstCSPop;
- if (TargetMBB) {
+ if (CatchRetTarget) {
// Fill EAX/RAX with the address of the target block.
unsigned ReturnReg = STI.is64Bit() ? X86::RAX : X86::EAX;
if (STI.is64Bit()) {
- // LEA64r TargetMBB(%rip), %rax
+ // LEA64r CatchRetTarget(%rip), %rax
BuildMI(MBB, FirstCSPop, DL, TII.get(X86::LEA64r), ReturnReg)
.addReg(X86::RIP)
.addImm(0)
.addReg(0)
- .addMBB(TargetMBB)
+ .addMBB(CatchRetTarget)
.addReg(0);
} else {
- // MOV32ri $TargetMBB, %eax
+ // MOV32ri $CatchRetTarget, %eax
BuildMI(MBB, FirstCSPop, DL, TII.get(X86::MOV32ri), ReturnReg)
- .addMBB(TargetMBB);
+ .addMBB(CatchRetTarget);
}
- // Record that we've taken the address of TargetMBB and no longer just
+ // Record that we've taken the address of CatchRetTarget and no longer just
// reference it in a terminator.
- TargetMBB->setHasAddressTaken();
+ CatchRetTarget->setHasAddressTaken();
}
if (MBBI != MBB.end())
@@ -1677,13 +1667,12 @@ void X86FrameLowering::emitEpilogue(Mach
if (NeedsWinCFI && MF.hasWinCFI())
BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_Epilogue));
- if (!RetOpcode || !isTailCallOpcode(*RetOpcode)) {
+ MBBI = MBB.getFirstTerminator();
+ if (MBBI == MBB.end() || !isTailCallOpcode(MBBI->getOpcode())) {
// Add the return addr area delta back since we are not tail calling.
int Offset = -1 * X86FI->getTCReturnAddrDelta();
assert(Offset >= 0 && "TCDelta should never be positive");
if (Offset) {
- MBBI = MBB.getFirstTerminator();
-
// Check for possible merge with preceding ADD instruction.
Offset += mergeSPUpdates(MBB, MBBI, true);
emitSPUpdate(MBB, MBBI, Offset, /*InEpilogue=*/true);
More information about the llvm-commits
mailing list