From 160a3da184d965ea20b73b1c882b5af63af32e62 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Wed, 4 Dec 2002 23:58:08 +0000 Subject: [PATCH] Added code generation for function prologues and epilogues. llvm-svn: 4930 --- llvm/lib/CodeGen/RegAllocSimple.cpp | 49 +++++++++++++++++++---------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/llvm/lib/CodeGen/RegAllocSimple.cpp b/llvm/lib/CodeGen/RegAllocSimple.cpp index 596ade5faca5..af9b67168888 100644 --- a/llvm/lib/CodeGen/RegAllocSimple.cpp +++ b/llvm/lib/CodeGen/RegAllocSimple.cpp @@ -12,6 +12,7 @@ #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/Target/MachineInstrInfo.h" #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/MachineRegInfo.h" #include "llvm/Target/TargetMachine.h" @@ -73,6 +74,12 @@ namespace { RegClassIdx.clear(); } + void cleanupAfterFunction() { + RegMap.clear(); + SSA2PhysRegMap.clear(); + NumBytesAllocated = 0; + } + /// Moves value from memory into that register MachineBasicBlock::iterator moveUseToReg (MachineBasicBlock::iterator I, unsigned VirtReg, @@ -150,7 +157,7 @@ RegAllocSimple::moveUseToReg (MachineBasicBlock::iterator I, // Add move instruction(s) return RegInfo->loadRegOffset2Reg(CurrMBB, I, PhysReg, RegInfo->getFramePointer(), - stackOffset, regClass->getDataSize()); + -stackOffset, regClass->getDataSize()); } MachineBasicBlock::iterator @@ -160,12 +167,12 @@ RegAllocSimple::saveVirtRegToStack (MachineBasicBlock::iterator I, const TargetRegisterClass* regClass = MF->getRegClass(VirtReg); assert(regClass); - unsigned offset = allocateStackSpaceFor(VirtReg, regClass); + unsigned stackOffset = allocateStackSpaceFor(VirtReg, regClass); // Add move instruction(s) return RegInfo->storeReg2RegOffset(CurrMBB, I, PhysReg, RegInfo->getFramePointer(), - offset, regClass->getDataSize()); + -stackOffset, regClass->getDataSize()); } MachineBasicBlock::iterator @@ -184,23 +191,12 @@ RegAllocSimple::savePhysRegToStack (MachineBasicBlock::iterator I, } bool RegAllocSimple::runOnMachineFunction(MachineFunction &Fn) { - RegMap.clear(); + cleanupAfterFunction(); + unsigned virtualReg, physReg; DEBUG(std::cerr << "Machine Function " << "\n"); MF = &Fn; -#if 0 - // FIXME: add prolog. we should preserve callee-save registers... - MachineFunction::iterator Fi = Fn.begin(); - MachineBasicBlock &MBB = *Fi; - MachineBasicBlock::iterator MBBi = MBB.begin() - const unsigned* calleeSaveRegs = tm.getCalleeSaveRegs(); - while (*calleeSaveRegs) { - //MBBi = saveRegToStack(MBBi, *calleeSaveRegs, - ++calleeSaveRegs; - } -#endif - for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); MBB != MBBe; ++MBB) { @@ -252,7 +248,26 @@ bool RegAllocSimple::runOnMachineFunction(MachineFunction &Fn) { } - // FIXME: add epilog. we should preserve callee-save registers... + // add prologue we should preserve callee-save registers... + MachineFunction::iterator Fi = Fn.begin(); + MachineBasicBlock *MBB = Fi; + MachineBasicBlock::iterator MBBi = MBB->begin(); + RegInfo->emitPrologue(MBB, MBBi, NumBytesAllocated); + + // add epilogue to restore the callee-save registers + // loop over the basic block + for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); + MBB != MBBe; ++MBB) + { + // check if last instruction is a RET + MachineBasicBlock::iterator I = (*MBB).end(); + MachineInstr *MI = *(--I); + const MachineInstrInfo &MII = TM.getInstrInfo(); + if (MII.isReturn(MI->getOpcode())) { + // this block has a return instruction, add epilogue + RegInfo->emitEpilogue(MBB, I, NumBytesAllocated); + } + } return false; // We never modify the LLVM itself. }