PrologEpilogInserter.cpp revision ea84c5ee952c62dd0c703c9852d7a60715e4a435
158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===-- PrologEpilogInserter.cpp - Insert Prolog/Epilog code in function --===// 2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// 1058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass is responsible for finalizing the functions frame layout, saving 1158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// callee saved registers, and for emitting prolog & epilog code for the 1258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// function. 1358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// 1458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass must be run after register allocation. After this pass is 1558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// executed, it is illegal to construct MO_FrameIndex operands. 1658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// 1758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===----------------------------------------------------------------------===// 1858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 19f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/Passes.h" 20f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/MachineFunctionPass.h" 2158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/MachineInstr.h" 22eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h" 2349dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng#include "llvm/CodeGen/RegisterScavenging.h" 2458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/TargetMachine.h" 2558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/MRegisterInfo.h" 268bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h" 273501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 28a4f0b3a084d120cfc5b5bb06f64b222f5cb72740Chris Lattner#include "llvm/Support/Compiler.h" 29c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng#include <climits> 3005d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattnerusing namespace llvm; 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnernamespace { 33f8c68f694c25b1ae8c0e5adb2a19432cb405d232Chris Lattner struct VISIBILITY_HIDDEN PEI : public MachineFunctionPass { 34f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner const char *getPassName() const { 35f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner return "Prolog/Epilog Insertion & Frame Finalization"; 3658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 3758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 3858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner /// runOnMachineFunction - Insert prolog/epilog code and replace abstract 3958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner /// frame indexes with appropriate references. 4058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner /// 4158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner bool runOnMachineFunction(MachineFunction &Fn) { 4287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng const MRegisterInfo *MRI = Fn.getTarget().getRegisterInfo(); 4387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng RS = MRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : NULL; 4487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 4544c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey // Get MachineModuleInfo so that we can track the construction of the 464188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // frame. 4744c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey if (MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>()) { 4844c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey Fn.getFrameInfo()->setMachineModuleInfo(MMI); 494188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey } 50c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 51c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Allow the target machine to make some adjustments to the function 52c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // e.g. UsedPhysRegs before calculateCalleeSavedRegisters. 5387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng MRI->processFunctionBeforeCalleeSavedScan(Fn, RS); 54c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 55692d4e0823774730b90e8e2d7bf58119397f0535Evan Cheng // Scan the function for modified callee saved registers and insert spill 56692d4e0823774730b90e8e2d7bf58119397f0535Evan Cheng // code for any callee saved registers that are modified. Also calculate 5758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // the MaxCallFrameSize and HasCalls variables for the function's frame 5858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // information and eliminates call frame pseudo instructions. 59692d4e0823774730b90e8e2d7bf58119397f0535Evan Cheng calculateCalleeSavedRegisters(Fn); 60c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 61c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Add the code to save and restore the callee saved registers 62c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng saveCalleeSavedRegisters(Fn); 6358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 6458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Allow the target machine to make final modifications to the function 6558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // before the frame layout is finalized. 6658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner Fn.getTarget().getRegisterInfo()->processFunctionBeforeFrameFinalized(Fn); 6758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 6858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Calculate actual frame offsets for all of the abstract stack objects... 6958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner calculateFrameObjectOffsets(Fn); 7058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 71c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // Add prolog and epilog code to the function. This function is required 72c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // to align the stack frame as necessary for any stack variables or 73692d4e0823774730b90e8e2d7bf58119397f0535Evan Cheng // called functions. Because of this, calculateCalleeSavedRegisters 74c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // must be called before this function in order to set the HasCalls 75c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // and MaxCallFrameSize variables. 764ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner insertPrologEpilogCode(Fn); 774ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner 7858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Replace all MO_FrameIndex operands with physical register references 7958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // and actual offsets. 8058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // 8158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner replaceFrameIndices(Fn); 82c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 8387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng delete RS; 8458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner return true; 8558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 86f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey 8758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner private: 8887f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng RegScavenger *RS; 8987f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 90ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved 91c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // stack frame indexes. 92c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng unsigned MinCSFrameIndex, MaxCSFrameIndex; 93c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 94692d4e0823774730b90e8e2d7bf58119397f0535Evan Cheng void calculateCalleeSavedRegisters(MachineFunction &Fn); 95c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng void saveCalleeSavedRegisters(MachineFunction &Fn); 9658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner void calculateFrameObjectOffsets(MachineFunction &Fn); 9758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner void replaceFrameIndices(MachineFunction &Fn); 9858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner void insertPrologEpilogCode(MachineFunction &Fn); 9958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner }; 10058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner} 10158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 102d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 10358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// createPrologEpilogCodeInserter - This function returns a pass that inserts 10458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// prolog and epilog code, and eliminates abstract frame references. 10558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// 10605d8350c12d8d81de1d8af6f7da155bc1c1da50eChris LattnerFunctionPass *llvm::createPrologEpilogCodeInserter() { return new PEI(); } 10758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 10858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 109c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng/// calculateCalleeSavedRegisters - Scan the function for modified callee saved 110c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner/// registers. Also calculate the MaxCallFrameSize and HasCalls variables for 11158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// the function's frame information and eliminates call frame pseudo 11258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// instructions. 11358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// 114692d4e0823774730b90e8e2d7bf58119397f0535Evan Chengvoid PEI::calculateCalleeSavedRegisters(MachineFunction &Fn) { 11558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo(); 116c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner const TargetFrameInfo *TFI = Fn.getTarget().getFrameInfo(); 11758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 11858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Get the callee saved register list... 119ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng const unsigned *CSRegs = RegInfo->getCalleeSavedRegs(); 12058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 12158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Get the function call frame set-up and tear-down instruction opcode 12258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner int FrameSetupOpcode = RegInfo->getCallFrameSetupOpcode(); 12358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode(); 12458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 1257d3223eef2982d7acdfb24facde6605fd9a8b5e8Evan Cheng // These are used to keep track the callee-save area. Initialize them. 1267d3223eef2982d7acdfb24facde6605fd9a8b5e8Evan Cheng MinCSFrameIndex = INT_MAX; 1277d3223eef2982d7acdfb24facde6605fd9a8b5e8Evan Cheng MaxCSFrameIndex = 0; 1287d3223eef2982d7acdfb24facde6605fd9a8b5e8Evan Cheng 12958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Early exit for targets which have no callee saved registers and no call 13058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // frame setup/destroy pseudo instructions. 13158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner if ((CSRegs == 0 || CSRegs[0] == 0) && 13258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner FrameSetupOpcode == -1 && FrameDestroyOpcode == -1) 13358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner return; 13458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 13558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner unsigned MaxCallFrameSize = 0; 13658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner bool HasCalls = false; 13758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 13858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) 13958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) 140c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos if (I->getOpcode() == FrameSetupOpcode || 141d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner I->getOpcode() == FrameDestroyOpcode) { 1422a82ef317c39ac436f80854c7ddbb06bfddeada1Chris Lattner assert(I->getNumOperands() >= 1 && "Call Frame Setup/Destroy Pseudo" 143d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner " instructions should have a single immediate argument!"); 144d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner unsigned Size = I->getOperand(0).getImmedValue(); 145d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner if (Size > MaxCallFrameSize) MaxCallFrameSize = Size; 146d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner HasCalls = true; 147d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner RegInfo->eliminateCallFramePseudoInstr(Fn, *BB, I++); 14858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } else { 149d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner ++I; 15058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 15158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 152eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner MachineFrameInfo *FFI = Fn.getFrameInfo(); 15358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner FFI->setHasCalls(HasCalls); 15458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner FFI->setMaxCallFrameSize(MaxCallFrameSize); 15558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 15658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Now figure out which *callee saved* registers are modified by the current 15758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // function, thus needing to be saved and restored in the prolog/epilog. 15858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // 1593563015b0df358cfc4ec310eb0df195015ea54a5Chris Lattner const bool *PhysRegsUsed = Fn.getUsedPhysregs(); 16080a4f169b4a8cd160f832fd4a1052e5d9b2c1a92Chris Lattner const TargetRegisterClass* const *CSRegClasses = 161ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng RegInfo->getCalleeSavedRegClasses(); 16208ede262a744f99429658fadb43662441bdcb42dJim Laskey std::vector<CalleeSavedInfo> CSI; 16358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner for (unsigned i = 0; CSRegs[i]; ++i) { 16458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner unsigned Reg = CSRegs[i]; 1653563015b0df358cfc4ec310eb0df195015ea54a5Chris Lattner if (PhysRegsUsed[Reg]) { 16680a4f169b4a8cd160f832fd4a1052e5d9b2c1a92Chris Lattner // If the reg is modified, save it! 167f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey CSI.push_back(CalleeSavedInfo(Reg, CSRegClasses[i])); 16873ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos } else { 16973ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg); 1703563015b0df358cfc4ec310eb0df195015ea54a5Chris Lattner *AliasSet; ++AliasSet) { // Check alias registers too. 1713563015b0df358cfc4ec310eb0df195015ea54a5Chris Lattner if (PhysRegsUsed[*AliasSet]) { 172f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey CSI.push_back(CalleeSavedInfo(Reg, CSRegClasses[i])); 173d555da52f4301f0a221845d5a549848f5ae84577Chris Lattner break; 174ecf8afdc2065dec1ca739e2b6a96f8e72dc34533Chris Lattner } 17573ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos } 17673ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos } 17758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 17858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 179f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey if (CSI.empty()) 180c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng return; // Early exit if no callee saved registers are modified! 18158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 182c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner unsigned NumFixedSpillSlots; 1838c9b4de5744ea6c4ce8b79e8a55130df268761cdAlkis Evlogimenos const std::pair<unsigned,int> *FixedSpillSlots = 184ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng TFI->getCalleeSavedSpillSlots(NumFixedSpillSlots); 185c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 18658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Now that we know which registers need to be saved and restored, allocate 18758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // stack slots for them. 188f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 189f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey unsigned Reg = CSI[i].getReg(); 190f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey const TargetRegisterClass *RC = CSI[i].getRegClass(); 191c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 192c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // Check to see if this physreg must be spilled to a particular stack slot 193c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // on this target. 1948c9b4de5744ea6c4ce8b79e8a55130df268761cdAlkis Evlogimenos const std::pair<unsigned,int> *FixedSlot = FixedSpillSlots; 195c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner while (FixedSlot != FixedSpillSlots+NumFixedSpillSlots && 196c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner FixedSlot->first != Reg) 197c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner ++FixedSlot; 198c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 199fa1face30a1943aa17560f6f6e10bb667b257065Chris Lattner int FrameIdx; 200c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner if (FixedSlot == FixedSpillSlots+NumFixedSpillSlots) { 201c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // Nope, just spill it anywhere convenient. 2025feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng unsigned Align = RC->getAlignment(); 2035feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng unsigned StackAlign = TFI->getStackAlignment(); 2045feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng // We may not be able to sastify the desired alignment specification of 2055feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng // the TargetRegisterClass if the stack alignment is smaller. Use the min. 2065feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng Align = std::min(Align, StackAlign); 2075feaa9a70716e9181a9b940236bc461f2a75334aEvan Cheng FrameIdx = FFI->CreateStackObject(RC->getSize(), Align); 208c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if ((unsigned)FrameIdx < MinCSFrameIndex) MinCSFrameIndex = FrameIdx; 209c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if ((unsigned)FrameIdx > MaxCSFrameIndex) MaxCSFrameIndex = FrameIdx; 210c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner } else { 211c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner // Spill it to the stack where we must. 2128fb040e584606f048b85d87363a52baf5ff9c1c7Chris Lattner FrameIdx = FFI->CreateFixedObject(RC->getSize(), FixedSlot->second); 213c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner } 214f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey CSI[i].setFrameIdx(FrameIdx); 21558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 21608ede262a744f99429658fadb43662441bdcb42dJim Laskey 21708ede262a744f99429658fadb43662441bdcb42dJim Laskey FFI->setCalleeSavedInfo(CSI); 218c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner} 219c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 220c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng/// saveCalleeSavedRegisters - Insert spill code for any callee saved registers 221c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner/// that are modified in the function. 222c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner/// 223c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Chengvoid PEI::saveCalleeSavedRegisters(MachineFunction &Fn) { 224f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey // Get callee saved register information. 225f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey MachineFrameInfo *FFI = Fn.getFrameInfo(); 22608ede262a744f99429658fadb43662441bdcb42dJim Laskey const std::vector<CalleeSavedInfo> &CSI = FFI->getCalleeSavedInfo(); 227f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey 228c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Early exit if no callee saved registers are modified! 229f3e4f0e615bb2c36c4a9d60bb908e08b76025c75Jim Laskey if (CSI.empty()) 230edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman return; 231c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner 232c330b68fb7f1cb7f05a60ab4d811bba397538840Chris Lattner const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo(); 23358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 23458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Now that we have a stack slot for each register to be saved, insert spill 23592b9fcea7b3180ed18f379212d14bd5cea7a1954Chris Lattner // code into the entry block. 23658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner MachineBasicBlock *MBB = Fn.begin(); 23758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner MachineBasicBlock::iterator I = MBB->begin(); 238ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng if (!RegInfo->spillCalleeSavedRegisters(*MBB, I, CSI)) { 239ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 24049dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng // Add the callee-saved register as live-in. It's killed at the spill. 24149dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng MBB->addLiveIn(CSI[i].getReg()); 24249dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng 243ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // Insert the spill to the stack frame. 244ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng RegInfo->storeRegToStackSlot(*MBB, I, CSI[i].getReg(), 24549dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng CSI[i].getFrameIdx(), CSI[i].getRegClass()); 246ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng } 24758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 24858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 24958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Add code to restore the callee-save registers in each exiting block. 2509bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo(); 25192b9fcea7b3180ed18f379212d14bd5cea7a1954Chris Lattner for (MachineFunction::iterator FI = Fn.begin(), E = Fn.end(); FI != E; ++FI) 25292b9fcea7b3180ed18f379212d14bd5cea7a1954Chris Lattner // If last instruction is a return instruction, add an epilogue. 253c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos if (!FI->empty() && TII.isReturn(FI->back().getOpcode())) { 254c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos MBB = FI; 255c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos I = MBB->end(); --I; 25658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 2574fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner // Skip over all terminator instructions, which are part of the return 2584fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner // sequence. 2594fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner MachineBasicBlock::iterator I2 = I; 2604fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner while (I2 != MBB->begin() && TII.isTerminatorInstr((--I2)->getOpcode())) 2614fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner I = I2; 2624fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner 263dfd58709cc78e841ef4a50ba75d940473031617eChris Lattner bool AtStart = I == MBB->begin(); 264ed461e0fafbd0b905cb716df108000bcd6ecf3d4Chris Lattner MachineBasicBlock::iterator BeforeI = I; 265ed461e0fafbd0b905cb716df108000bcd6ecf3d4Chris Lattner if (!AtStart) 266ed461e0fafbd0b905cb716df108000bcd6ecf3d4Chris Lattner --BeforeI; 267ed461e0fafbd0b905cb716df108000bcd6ecf3d4Chris Lattner 2684fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner // Restore all registers immediately before the return and any terminators 2694fc997941dde5c11e91a28c9b5b8fa331d053a18Chris Lattner // that preceed it. 270ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng if (!RegInfo->restoreCalleeSavedRegisters(*MBB, I, CSI)) { 271ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng for (unsigned i = 0, e = CSI.size(); i != e; ++i) { 272ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng RegInfo->loadRegFromStackSlot(*MBB, I, CSI[i].getReg(), 273ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng CSI[i].getFrameIdx(), 274ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng CSI[i].getRegClass()); 275ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng assert(I != MBB->begin() && 276ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng "loadRegFromStackSlot didn't insert any code!"); 277ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // Insert in reverse order. loadRegFromStackSlot can insert multiple 278ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // instructions. 279ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng if (AtStart) 280ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng I = MBB->begin(); 281ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng else { 282ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng I = BeforeI; 283ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng ++I; 284ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng } 285ed461e0fafbd0b905cb716df108000bcd6ecf3d4Chris Lattner } 28658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 28758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 28858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner} 28958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 29058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 29158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the 29292b9fcea7b3180ed18f379212d14bd5cea7a1954Chris Lattner/// abstract stack objects. 29358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// 29458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { 2959bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner const TargetFrameInfo &TFI = *Fn.getTarget().getFrameInfo(); 296edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 29758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner bool StackGrowsDown = 29858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner TFI.getStackGrowthDirection() == TargetFrameInfo::StackGrowsDown; 299edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 30058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner // Loop over all of the stack objects, assigning sequential addresses... 301eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner MachineFrameInfo *FFI = Fn.getFrameInfo(); 30258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 303cbef8ba5f959b3c4f932005ceef5cf2e0d899f9bChris Lattner unsigned MaxAlign = 0; 30478d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner 30505d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner // Start at the beginning of the local area. 306577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // The Offset is the distance from the stack top in the direction 307577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // of stack growth -- so it's always positive. 308a401b1e1c5eb9563617db8a2477b4c5f8b239521Chris Lattner int64_t Offset = TFI.getOffsetOfLocalArea(); 309577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner if (StackGrowsDown) 3107f7bbc2fdb833485ac3d865a405fd948e58e8ddbChris Lattner Offset = -Offset; 311edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman assert(Offset >= 0 312577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner && "Local area offset should be in direction of stack growth"); 313577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner 314577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // If there are fixed sized objects that are preallocated in the local area, 315577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // non-fixed objects can't be allocated right at the start of local area. 316edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman // We currently don't support filling in holes in between fixed sized objects, 317577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // so we adjust 'Offset' to point to the end of last fixed sized 31805d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner // preallocated object. 31905d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) { 320a401b1e1c5eb9563617db8a2477b4c5f8b239521Chris Lattner int64_t FixedOff; 321577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner if (StackGrowsDown) { 322577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // The maximum distance from the stack pointer is at lower address of 323577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // the object -- which is given by offset. For down growing stack 324577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // the offset is negative, so we negate the offset to get the distance. 325577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner FixedOff = -FFI->getObjectOffset(i); 326577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner } else { 327edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman // The maximum distance from the start pointer is at the upper 328577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // address of the object. 329577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner FixedOff = FFI->getObjectOffset(i) + FFI->getObjectSize(i); 330edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman } 331edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman if (FixedOff > Offset) Offset = FixedOff; 33205d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner } 33305d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner 334c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // First assign frame offsets to stack objects that are used to spill 335ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // callee saved registers. 336c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if (StackGrowsDown) { 337c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) { 338c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if (i < MinCSFrameIndex || i > MaxCSFrameIndex) 339c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng continue; 340c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 341c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // If stack grows down, we need to add size of find the lowest 342c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // address of the object. 343c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng Offset += FFI->getObjectSize(i); 344c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 345c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng unsigned Align = FFI->getObjectAlignment(i); 346c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // If the alignment of this object is greater than that of the stack, then 347c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // increase the stack alignment to match. 348c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng MaxAlign = std::max(MaxAlign, Align); 349c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Adjust to alignment boundary 350c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng Offset = (Offset+Align-1)/Align*Align; 351c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 352c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng FFI->setObjectOffset(i, -Offset); // Set the computed offset 353c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng } 354c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng } else { 355c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng for (int i = FFI->getObjectIndexEnd()-1; i >= 0; --i) { 356c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if ((unsigned)i < MinCSFrameIndex || (unsigned)i > MaxCSFrameIndex) 357c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng continue; 358c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 359c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng unsigned Align = FFI->getObjectAlignment(i); 360c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // If the alignment of this object is greater than that of the stack, then 361c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // increase the stack alignment to match. 362c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng MaxAlign = std::max(MaxAlign, Align); 363c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Adjust to alignment boundary 364c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng Offset = (Offset+Align-1)/Align*Align; 365c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 366c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng FFI->setObjectOffset(i, Offset); 367c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng Offset += FFI->getObjectSize(i); 368c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng } 369c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng } 370c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 37187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // Make sure the special register scavenging spill slot is closest to the 37287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // frame pointer if a frame pointer is required. 37387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo(); 37487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (RS && RegInfo->hasFP(Fn)) { 37587f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng int SFI = RS->getScavengingFrameIndex(); 37687f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (SFI >= 0) { 37787f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // If stack grows down, we need to add size of find the lowest 37887f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // address of the object. 37987f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (StackGrowsDown) 38087f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset += FFI->getObjectSize(SFI); 38187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 38287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng unsigned Align = FFI->getObjectAlignment(SFI); 38387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // Adjust to alignment boundary 38487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset = (Offset+Align-1)/Align*Align; 38587f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 38687f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (StackGrowsDown) { 38787f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng FFI->setObjectOffset(SFI, -Offset); // Set the computed offset 38887f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } else { 38987f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng FFI->setObjectOffset(SFI, Offset); 39087f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset += FFI->getObjectSize(SFI); 39187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 39287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 39387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 39487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 395c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng // Then assign frame offsets to stack objects that are not used to spill 396ad93d7fda53d92d07a3b3a2087e46de7cd695752Evan Cheng // callee saved registers. 39758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) { 398c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng if (i >= MinCSFrameIndex && i <= MaxCSFrameIndex) 399c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng continue; 40087f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (RS && (int)i == RS->getScavengingFrameIndex()) 40187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng continue; 402c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng 403577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // If stack grows down, we need to add size of find the lowest 404577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner // address of the object. 405577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner if (StackGrowsDown) 406577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner Offset += FFI->getObjectSize(i); 40758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 40858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner unsigned Align = FFI->getObjectAlignment(i); 409ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman // If the alignment of this object is greater than that of the stack, then 410ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman // increase the stack alignment to match. 411ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman MaxAlign = std::max(MaxAlign, Align); 412ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman // Adjust to alignment boundary 413ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman Offset = (Offset+Align-1)/Align*Align; 414edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 415577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner if (StackGrowsDown) { 416577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner FFI->setObjectOffset(i, -Offset); // Set the computed offset 417577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner } else { 418edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman FFI->setObjectOffset(i, Offset); 419577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner Offset += FFI->getObjectSize(i); 420577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner } 42158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner } 42258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 42387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // Make sure the special register scavenging spill slot is closest to the 42487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // stack pointer. 42587f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (RS) { 42687f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng int SFI = RS->getScavengingFrameIndex(); 42787f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (SFI >= 0) { 42887f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // If stack grows down, we need to add size of find the lowest 42987f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // address of the object. 43087f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (StackGrowsDown) 43187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset += FFI->getObjectSize(SFI); 43287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 43387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng unsigned Align = FFI->getObjectAlignment(SFI); 43487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng // Adjust to alignment boundary 43587f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset = (Offset+Align-1)/Align*Align; 43687f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 43787f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng if (StackGrowsDown) { 43887f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng FFI->setObjectOffset(SFI, -Offset); // Set the computed offset 43987f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } else { 44087f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng FFI->setObjectOffset(SFI, Offset); 44187f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng Offset += FFI->getObjectSize(SFI); 44287f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 44387f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 44487f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng } 44587f8bf65dd869348dd4d2884a417e2e22ae4f981Evan Cheng 446367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // Round up the size to a multiple of the alignment, but only if there are 447367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // calls or alloca's in the function. This ensures that any calls to 448367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // subroutines have their stack frames suitable aligned. 44902a20291410a6814c657b69901a57103d4861a07Evan Cheng if (!RegInfo->targetHandlesStackFrameRounding() && 45002a20291410a6814c657b69901a57103d4861a07Evan Cheng (FFI->hasCalls() || FFI->hasVarSizedObjects())) { 451367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // When we have no frame pointer, we reserve argument space for call sites 452367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // in the function immediately on entry to the current function. This 453367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // eliminates the need for add/sub sp brackets around call sites. 454367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng if (!RegInfo->hasFP(Fn)) 455367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng Offset += FFI->getMaxCallFrameSize(); 456367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng 457367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng unsigned AlignMask = TFI.getStackAlignment() - 1; 458ea84c5ee952c62dd0c703c9852d7a60715e4a435Chris Lattner Offset = (Offset + AlignMask) & ~uint64_t(AlignMask); 459367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng } 460367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng 461367372a30c36776e31958f0dc38306f32b80aa7cEvan Cheng // Update frame info to pretend that this is part of the stack... 4627f7bbc2fdb833485ac3d865a405fd948e58e8ddbChris Lattner FFI->setStackSize(Offset+TFI.getOffsetOfLocalArea()); 463cbef8ba5f959b3c4f932005ceef5cf2e0d899f9bChris Lattner 464cbef8ba5f959b3c4f932005ceef5cf2e0d899f9bChris Lattner // Remember the required stack alignment in case targets need it to perform 465cbef8ba5f959b3c4f932005ceef5cf2e0d899f9bChris Lattner // dynamic stack alignment. 4664672f71ac4d056aa22d6b09838a3eb22a2e384e7Chris Lattner assert(FFI->getMaxAlignment() == MaxAlign && 4674672f71ac4d056aa22d6b09838a3eb22a2e384e7Chris Lattner "Stack alignment calculation broken!"); 4684ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner} 4694ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner 4704ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner 471c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng/// insertPrologEpilogCode - Scan the function for modified callee saved 472c2b4ec37dea2586765a04d74120e1b6197bbd804Evan Cheng/// registers, insert spill code for these callee saved registers, then add 4734ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// prolog and epilog code to the function. 4744ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// 4754ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) { 4764ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner // Add prologue to the function... 4774ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner Fn.getTarget().getRegisterInfo()->emitPrologue(Fn); 4784ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner 4794ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner // Add epilogue to restore the callee-save registers in each exiting block 4809bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo(); 4814ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { 4824ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner // If last instruction is a return instruction, add an epilogue 483c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos if (!I->empty() && TII.isReturn(I->back().getOpcode())) 4844ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I); 4854ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner } 48658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner} 48758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 48858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 48958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical 49058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets. 49158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// 49258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) { 49358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do? 49458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 49558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner const TargetMachine &TM = Fn.getTarget(); 49658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); 49758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner const MRegisterInfo &MRI = *TM.getRegisterInfo(); 49858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner 49949dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { 50023322d1427e319089f5098d02cefbc7d8446d746Evan Cheng if (RS) RS->enterBasicBlock(BB); 5010ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) { 5020ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner MachineInstr *MI = I++; 5030ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) 5040ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner if (MI->getOperand(i).isFrameIndex()) { 505ecf8afdc2065dec1ca739e2b6a96f8e72dc34533Chris Lattner // If this instruction has a FrameIndex operand, we need to use that 506ecf8afdc2065dec1ca739e2b6a96f8e72dc34533Chris Lattner // target machine register info object to eliminate it. 5070ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner MRI.eliminateFrameIndex(MI, RS); 508d2eae62e93fc6e398263a952609b6ea60a204802Chris Lattner 509d2eae62e93fc6e398263a952609b6ea60a204802Chris Lattner // Revisit the instruction in full. Some instructions (e.g. inline 510d2eae62e93fc6e398263a952609b6ea60a204802Chris Lattner // asm instructions) can have multiple frame indices. 5110ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner --I; 5120ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner MI = 0; 5130ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner break; 514ecf8afdc2065dec1ca739e2b6a96f8e72dc34533Chris Lattner } 51549dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng // Update register states. 5160ebe9c132c6b9c74b334f0c7503e702b499575d5Chris Lattner if (RS && MI) RS->forward(MI); 51749dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng } 51849dd06461a7e027a6c938f0570297d46f2f34218Evan Cheng } 51958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner} 520