Create a stack slot for the return address lazily instead of eagerly. This
authorChris Lattner <sabre@nondot.org>
Fri, 17 Dec 2004 00:07:46 +0000 (00:07 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 17 Dec 2004 00:07:46 +0000 (00:07 +0000)
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

index ed93101ecb72a1e78be962ad7bbcb8d356c0c5b3..2d77f7e1fc500db901da29588dbed3226c5c32f6 100644 (file)
@@ -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<Constant>(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),