From 11cf7aa775dece12fbf29c57c1e97eb0c5eb06ad Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 17 Dec 2004 00:07:46 +0000 Subject: [PATCH] Create a stack slot for the return address lazily instead of eagerly. This save small amounts of time for functions that don't call llvm.returnaddress or llvm.frameaddress (which is almost all functions). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19006 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelSimple.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index ed93101ecb7..2d77f7e1fc5 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -96,6 +96,9 @@ namespace { /// the entire function. /// bool runOnFunction(Function &Fn) { + // Lazily create a stack slot for the return address if needed. + ReturnAddressIndex = -1; + // First pass over the function, lower any unknown intrinsic functions // with the IntrinsicLowering class. LowerUnknownIntrinsicFunctionCalls(Fn); @@ -108,10 +111,6 @@ namespace { BB = &F->front(); - // Set up a frame object for the return address. This is used by the - // llvm.returnaddress & llvm.frameaddress intrinisics. - ReturnAddressIndex = F->getFrameInfo()->CreateFixedObject(4, -4); - // Copy incoming arguments off of the stack... LoadArgumentsToVirtualRegs(Fn); @@ -1765,6 +1764,11 @@ void X86ISel::visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI) { case Intrinsic::frameaddress: TmpReg1 = getReg(CI); if (cast(CI.getOperand(1))->isNullValue()) { + if (ReturnAddressIndex == -1) { + // Set up a frame object for the return address. + ReturnAddressIndex = F->getFrameInfo()->CreateFixedObject(4, -4); + } + if (ID == Intrinsic::returnaddress) { // Just load the return address addFrameReference(BuildMI(BB, X86::MOV32rm, 4, TmpReg1),