From cae1b628a791f77fb6a1fd326fbf2230ddc27825 Mon Sep 17 00:00:00 2001 From: Sanjiv Gupta Date: Mon, 6 Apr 2009 10:54:50 +0000 Subject: [PATCH] Map stack based frameindices for spills to zero based indices that can be accessed based on an external symbol defining the location of temporary data for a function. For example: we have spill slots addressed as foo.tmp + 0, foo.tmp + 1 etc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68442 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PIC16/PIC16AsmPrinter.cpp | 15 ++----- lib/Target/PIC16/PIC16AsmPrinter.h | 4 +- lib/Target/PIC16/PIC16ISelLowering.cpp | 54 +++++++++++++++++--------- lib/Target/PIC16/PIC16ISelLowering.h | 16 ++++++++ lib/Target/PIC16/PIC16InstrInfo.cpp | 6 ++- 5 files changed, 62 insertions(+), 33 deletions(-) diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp index b4950436ced..c0b1f6e8607 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.cpp +++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp @@ -343,7 +343,6 @@ bool PIC16AsmPrinter::doFinalization(Module &M) { void PIC16AsmPrinter::emitFunctionData(MachineFunction &MF) { const Function *F = MF.getFunction(); std::string FuncName = Mang->getValueName(F); - MachineFrameInfo *MFI= MF.getFrameInfo(); Module *M = const_cast(F->getParent()); const TargetData *TD = TM.getTargetData(); unsigned FrameSize = 0; @@ -406,15 +405,7 @@ void PIC16AsmPrinter::emitFunctionData(MachineFunction &MF) { O << VarName << " RES " << Size << "\n"; } - - // Emit the variable to hold the space for temporary locations - // in function frame. - if (MFI->hasStackObjects()) { - int indexBegin = MFI->getObjectIndexBegin(); - int indexEnd = MFI->getObjectIndexEnd(); - if (indexBegin < indexEnd) { - int TempSize = indexEnd - indexBegin; - O << CurrentFnName << ".tmp RES " << TempSize <<"\n"; - } - } + int TempSize = PTLI->GetTmpSize(); + if (TempSize > 0 ) + O << CurrentFnName << ".tmp RES " << TempSize <<"\n"; } diff --git a/lib/Target/PIC16/PIC16AsmPrinter.h b/lib/Target/PIC16/PIC16AsmPrinter.h index 5286dd2e7a3..05f6eff70de 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.h +++ b/lib/Target/PIC16/PIC16AsmPrinter.h @@ -24,11 +24,12 @@ namespace llvm { struct VISIBILITY_HIDDEN PIC16AsmPrinter : public AsmPrinter { - PIC16AsmPrinter(raw_ostream &O, TargetMachine &TM, + PIC16AsmPrinter(raw_ostream &O, PIC16TargetMachine &TM, const TargetAsmInfo *T, bool F, bool V) : AsmPrinter(O, TM, T, F, V) { CurBank = ""; IsRomData = false; + PTLI = TM.getTargetLowering(); } private : virtual const char *getPassName() const { @@ -51,6 +52,7 @@ namespace llvm { bool doFinalization(Module &M); private: + PIC16TargetLowering *PTLI; std::string CurBank; bool IsRomData; }; diff --git a/lib/Target/PIC16/PIC16ISelLowering.cpp b/lib/Target/PIC16/PIC16ISelLowering.cpp index f196b14dc82..473e9d745d4 100644 --- a/lib/Target/PIC16/PIC16ISelLowering.cpp +++ b/lib/Target/PIC16/PIC16ISelLowering.cpp @@ -31,7 +31,7 @@ using namespace llvm; // PIC16TargetLowering Constructor. PIC16TargetLowering::PIC16TargetLowering(PIC16TargetMachine &TM) - : TargetLowering(TM) { + : TargetLowering(TM), TmpSize(0) { Subtarget = &TM.getSubtarget(); @@ -154,6 +154,17 @@ static SDValue getOutFlag(SDValue &Op) { return Flag; } +// Get the TmpOffset for FrameIndex +unsigned PIC16TargetLowering::GetTmpOffsetForFI(unsigned FI) { + std::map::iterator + MapIt = FiTmpOffsetMap.find(FI); + if (MapIt != FiTmpOffsetMap.end()) + return MapIt->second; + + // This FI (FrameIndex) is not yet mapped, so map it + FiTmpOffsetMap[FI] = TmpSize; + return TmpSize++; +} // To extract chain value from the SDValue Nodes // This function will help to maintain the chain extracting @@ -541,9 +552,9 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG, // and non-constant operand of ADD will be treated as pointer. // Returns the high and lo part of the address, and the offset(in case of ADD). -void PIC16TargetLowering:: LegalizeAddress(SDValue Ptr, SelectionDAG &DAG, - SDValue &Lo, SDValue &Hi, - unsigned &Offset, DebugLoc dl) { +void PIC16TargetLowering::LegalizeAddress(SDValue Ptr, SelectionDAG &DAG, + SDValue &Lo, SDValue &Hi, + unsigned &Offset, DebugLoc dl) { // Offset, by default, should be 0 Offset = 0; @@ -849,13 +860,15 @@ SDValue PIC16TargetLowering::ConvertToMemOperand(SDValue Op, DAG.getEntryNode(), Op, ES, DAG.getConstant (1, MVT::i8), // Banksel. - DAG.getConstant (FI, MVT::i8)); + DAG.getConstant (GetTmpOffsetForFI(FI), + MVT::i8)); // Load the value from ES. SDVTList Tys = DAG.getVTList(MVT::i8, MVT::Other); SDValue Load = DAG.getNode(PIC16ISD::PIC16Load, dl, Tys, Store, ES, DAG.getConstant (1, MVT::i8), - DAG.getConstant (FI, MVT::i8)); + DAG.getConstant (GetTmpOffsetForFI(FI), + MVT::i8)); return Load.getValue(0); } @@ -1212,40 +1225,45 @@ SDValue PIC16TargetLowering::LowerSUB(SDValue Op, SelectionDAG &DAG) { return DAG.getNode(Op.getOpcode(), dl, Tys, NewVal, Op.getOperand(1)); } -// LowerFORMAL_ARGUMENTS - In Lowering FORMAL ARGUMENTS - MERGE_VALUES nodes -// is returned. MERGE_VALUES nodes number of operands and number of values are -// equal. Therefore to construct MERGE_VALUE node, UNDEF nodes equal to the -// number of arguments of function have been created. +// LowerFORMAL_ARGUMENTS - Argument values are loaded from the +// .args + offset. All arguments are already broken to leaglized +// types, so the offset just runs from 0 to NumArgVals - 1. SDValue PIC16TargetLowering::LowerFORMAL_ARGUMENTS(SDValue Op, - SelectionDAG &DAG) { + SelectionDAG &DAG) { SmallVector ArgValues; - unsigned NumArgs = Op.getNode()->getNumValues()-1; + unsigned NumArgVals = Op.getNode()->getNumValues() - 1; DebugLoc dl = Op.getDebugLoc(); SDValue Chain = Op.getOperand(0); // Formal arguments' chain + + // Reset the map of FI and TmpOffset + ResetTmpOffsetMap(); + // Get the callee's name to create the .args label to pass args. MachineFunction &MF = DAG.getMachineFunction(); - //const TargetData *TD = getTargetData(); const Function *F = MF.getFunction(); std::string FuncName = F->getName(); + // Create the .args external symbol. char *tmpName = new char [strlen(FuncName.c_str()) + 6]; sprintf(tmpName, "%s.args", FuncName.c_str()); - SDVTList VTs = DAG.getVTList (MVT::i8, MVT::Other); SDValue ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8); + + // Load arg values from the label + offset. + SDVTList VTs = DAG.getVTList (MVT::i8, MVT::Other); SDValue BS = DAG.getConstant(1, MVT::i8); - for (unsigned i=0; igetVTList(), - &ArgValues[0], - ArgValues.size()).getValue(Op.getResNo()); + &ArgValues[0], ArgValues.size()).getValue(Op.getResNo()); } // Perform DAGCombine of PIC16Load. diff --git a/lib/Target/PIC16/PIC16ISelLowering.h b/lib/Target/PIC16/PIC16ISelLowering.h index 3dae35277fa..498610a9753 100644 --- a/lib/Target/PIC16/PIC16ISelLowering.h +++ b/lib/Target/PIC16/PIC16ISelLowering.h @@ -19,6 +19,7 @@ #include "PIC16Subtarget.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Target/TargetLowering.h" +#include namespace llvm { namespace PIC16ISD { @@ -117,6 +118,16 @@ namespace llvm { SDValue PerformPIC16LoadCombine(SDNode *N, DAGCombinerInfo &DCI) const; SDValue PerformStoreCombine(SDNode *N, DAGCombinerInfo &DCI) const; + // This function returns the Tmp Offset for FrameIndex. If any TmpOffset + // already exists for the FI then it returns the same else it creates the + // new offset and returns. + unsigned GetTmpOffsetForFI(unsigned FI); + void ResetTmpOffsetMap() { FiTmpOffsetMap.clear(); SetTmpSize(0); } + + // Return the size of Tmp variable + unsigned GetTmpSize() { return TmpSize; } + void SetTmpSize(unsigned Size) { TmpSize = Size; } + private: // If the Node is a BUILD_PAIR representing a direct Address, // then this function will return true. @@ -170,6 +181,11 @@ namespace llvm { // Check if operation has a direct load operand. inline bool isDirectLoad(const SDValue Op); + private: + // The frameindexes generated for spill/reload are stack based. + // This maps maintain zero based indexes for these FIs. + std::map FiTmpOffsetMap; + unsigned TmpSize; }; } // namespace llvm diff --git a/lib/Target/PIC16/PIC16InstrInfo.cpp b/lib/Target/PIC16/PIC16InstrInfo.cpp index 0066e67209d..99c27fdac77 100644 --- a/lib/Target/PIC16/PIC16InstrInfo.cpp +++ b/lib/Target/PIC16/PIC16InstrInfo.cpp @@ -69,6 +69,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned SrcReg, bool isKill, int FI, const TargetRegisterClass *RC) const { + PIC16TargetLowering *PTLI = TM.getTargetLowering(); DebugLoc DL = DebugLoc::getUnknownLoc(); if (I != MBB.end()) DL = I->getDebugLoc(); @@ -84,7 +85,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, //MachineRegisterInfo &RI = MF.getRegInfo(); BuildMI(MBB, I, DL, get(PIC16::movwf)) .addReg(SrcReg, false, false, isKill) - .addImm(FI) + .addImm(PTLI->GetTmpOffsetForFI(FI)) .addExternalSymbol(tmpName) .addImm(1); // Emit banksel for it. } @@ -98,6 +99,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned DestReg, int FI, const TargetRegisterClass *RC) const { + PIC16TargetLowering *PTLI = TM.getTargetLowering(); DebugLoc DL = DebugLoc::getUnknownLoc(); if (I != MBB.end()) DL = I->getDebugLoc(); @@ -112,7 +114,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, //MachineFunction &MF = *MBB.getParent(); //MachineRegisterInfo &RI = MF.getRegInfo(); BuildMI(MBB, I, DL, get(PIC16::movf), DestReg) - .addImm(FI) + .addImm(PTLI->GetTmpOffsetForFI(FI)) .addExternalSymbol(tmpName) .addImm(1); // Emit banksel for it. } -- 2.34.1