From 5839bf2b3bd22689d9dd0e9de66c2dce71d130ae Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 26 Aug 2005 17:15:30 +0000 Subject: [PATCH] Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23081 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/SelectionDAG.h | 7 +++--- include/llvm/CodeGen/SelectionDAGNodes.h | 8 +++---- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 14 +++-------- lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 8 +++++-- lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 23 +++++++++---------- .../SelectionDAG/SelectionDAGPrinter.cpp | 6 +++-- lib/Target/Alpha/AlphaISelPattern.cpp | 9 +++++--- lib/Target/IA64/IA64ISelPattern.cpp | 7 ++++-- lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 9 +++----- lib/Target/PowerPC/PPCISelPattern.cpp | 6 +++-- lib/Target/X86/X86ISelPattern.cpp | 13 +++++++---- 11 files changed, 59 insertions(+), 51 deletions(-) diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h index df17366dd8e..97934a536fe 100644 --- a/include/llvm/CodeGen/SelectionDAG.h +++ b/include/llvm/CodeGen/SelectionDAG.h @@ -100,8 +100,8 @@ public: SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT); SDOperand getFrameIndex(int FI, MVT::ValueType VT); SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT); - SDOperand getConstantPool(unsigned CPIdx, MVT::ValueType VT); - SDOperand getTargetConstantPool(unsigned CPIdx, MVT::ValueType VT); + SDOperand getConstantPool(Constant *C, MVT::ValueType VT); + SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT); SDOperand getBasicBlock(MachineBasicBlock *MBB); SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT); SDOperand getValueType(MVT::ValueType); @@ -320,7 +320,8 @@ private: std::map, SDNode*> TargetConstants; std::map, SDNode*> ConstantFPs; std::map FrameIndices, TargetFrameIndices; - std::map ConstantPoolIndices, TargetConstantPoolIndices; + std::map ConstantPoolIndices; + std::map TargetConstantPoolIndices; std::map BBNodes; std::vector ValueTypeNodes; std::map ExternalSymbols; diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 9f1769e0d69..40b73eec5a2 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -828,15 +828,15 @@ public: }; class ConstantPoolSDNode : public SDNode { - unsigned CPI; + Constant *C; protected: friend class SelectionDAG; - ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT, bool isTarget) + ConstantPoolSDNode(Constant *c, MVT::ValueType VT, bool isTarget) : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT), - CPI(cpi) {} + C(c) {} public: - unsigned getIndex() const { return CPI; } + Constant *get() const { return C; } static bool classof(const ConstantPoolSDNode *) { return true; } static bool classof(const SDNode *N) { diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index d94e8026dd2..dc706c1eeac 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/SelectionDAG.h" -#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/Support/MathExtras.h" @@ -248,9 +247,7 @@ SDOperand SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned, if (TLI.isLittleEndian()) FF <<= 32; static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF); - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestVT == MVT::f32) @@ -529,8 +526,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { if (!isLegal) { // Otherwise we need to spill the constant to memory. - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - bool Extend = false; // If a FP immediate is precise when represented as a float, we put it @@ -549,8 +544,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { Extend = true; } - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(LLVMC), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); if (Extend) { Result = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), CPIdx, DAG.getSrcValue(NULL), MVT::f32); @@ -2751,9 +2745,7 @@ ExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) { if (TLI.isLittleEndian()) FF <<= 32; static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF); - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestTy == MVT::f32) diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index 20236f8adff..33c9167f69b 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "sched" +#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/CodeGen/SelectionDAG.h" @@ -38,12 +39,14 @@ namespace { const TargetInstrInfo &TII; const MRegisterInfo &MRI; SSARegMap *RegMap; + MachineConstantPool *ConstPool; std::map EmittedOps; public: SimpleSched(SelectionDAG &D, MachineBasicBlock *bb) : DAG(D), BB(bb), TM(D.getTarget()), TII(*TM.getInstrInfo()), - MRI(*TM.getRegisterInfo()), RegMap(BB->getParent()->getSSARegMap()) { + MRI(*TM.getRegisterInfo()), RegMap(BB->getParent()->getSSARegMap()), + ConstPool(BB->getParent()->getConstantPool()) { assert(&TII && "Target doesn't provide instr info?"); assert(&MRI && "Target doesn't provide register info?"); } @@ -148,7 +151,8 @@ unsigned SimpleSched::Emit(SDOperand Op) { MI->addFrameIndexOperand(FI->getIndex()); } else if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(i))) { - MI->addConstantPoolIndexOperand(CP->getIndex()); + unsigned Idx = ConstPool->getConstantPoolIndex(CP->get()); + MI->addConstantPoolIndexOperand(Idx); } else if (ExternalSymbolSDNode *ES = dyn_cast(Op.getOperand(i))) { MI->addExternalSymbolOperand(ES->getSymbol(), false); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 2bcbd9857d0..25fba29845e 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -265,10 +265,10 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) { TargetFrameIndices.erase(cast(N)->getIndex()); break; case ISD::ConstantPool: - ConstantPoolIndices.erase(cast(N)->getIndex()); + ConstantPoolIndices.erase(cast(N)->get()); break; case ISD::TargetConstantPool: - TargetConstantPoolIndices.erase(cast(N)->getIndex()); + TargetConstantPoolIndices.erase(cast(N)->get()); break; case ISD::BasicBlock: BBNodes.erase(cast(N)->getBasicBlock()); @@ -452,19 +452,18 @@ SDOperand SelectionDAG::getTargetFrameIndex(int FI, MVT::ValueType VT) { return SDOperand(N, 0); } -SDOperand SelectionDAG::getConstantPool(unsigned CPIdx, MVT::ValueType VT) { - SDNode *N = ConstantPoolIndices[CPIdx]; +SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT) { + SDNode *&N = ConstantPoolIndices[C]; if (N) return SDOperand(N, 0); - N = new ConstantPoolSDNode(CPIdx, VT, false); + N = new ConstantPoolSDNode(C, VT, false); AllNodes.push_back(N); return SDOperand(N, 0); } -SDOperand SelectionDAG::getTargetConstantPool(unsigned CPIdx, - MVT::ValueType VT) { - SDNode *N = TargetConstantPoolIndices[CPIdx]; +SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT) { + SDNode *&N = TargetConstantPoolIndices[C]; if (N) return SDOperand(N, 0); - N = new ConstantPoolSDNode(CPIdx, VT, true); + N = new ConstantPoolSDNode(C, VT, true); AllNodes.push_back(N); return SDOperand(N, 0); } @@ -2134,8 +2133,8 @@ const char *SDNode::getOperationName(const SelectionDAG *G) const { case ISD::BasicBlock: return "BasicBlock"; case ISD::Register: return "Register"; case ISD::ExternalSymbol: return "ExternalSymbol"; - case ISD::ConstantPool: return "ConstantPoolIndex"; - case ISD::TargetConstantPool: return "TargetConstantPoolIndex"; + case ISD::ConstantPool: return "ConstantPool"; + case ISD::TargetConstantPool: return "TargetConstantPool"; case ISD::CopyToReg: return "CopyToReg"; case ISD::CopyFromReg: return "CopyFromReg"; case ISD::ImplicitDef: return "ImplicitDef"; @@ -2287,7 +2286,7 @@ void SDNode::dump(const SelectionDAG *G) const { } else if (const FrameIndexSDNode *FIDN = dyn_cast(this)) { std::cerr << "<" << FIDN->getIndex() << ">"; } else if (const ConstantPoolSDNode *CP = dyn_cast(this)){ - std::cerr << "<" << CP->getIndex() << ">"; + std::cerr << "<" << *CP->get() << ">"; } else if (const BasicBlockSDNode *BBDN = dyn_cast(this)) { std::cerr << "<"; const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp index bb0524db69d..d69004a557f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp @@ -11,11 +11,12 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Constants.h" +#include "llvm/Function.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Function.h" #include "llvm/Support/GraphWriter.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Config/config.h" @@ -67,7 +68,8 @@ std::string DOTGraphTraits::getNodeLabel(const SDNode *Node, } else if (const FrameIndexSDNode *FIDN = dyn_cast(Node)) { Op += " " + itostr(FIDN->getIndex()); } else if (const ConstantPoolSDNode *CP = dyn_cast(Node)){ - Op += "<" + utostr(CP->getIndex()) + ">"; + if (ConstantFP *CFP = dyn_cast(CP->get())) + Op += "<" + ftostr(CFP->getValue()) + ">"; } else if (const BasicBlockSDNode *BBDN = dyn_cast(Node)) { Op = "BB: "; const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); diff --git a/lib/Target/Alpha/AlphaISelPattern.cpp b/lib/Target/Alpha/AlphaISelPattern.cpp index e559852d2b9..cf5245d19c3 100644 --- a/lib/Target/Alpha/AlphaISelPattern.cpp +++ b/lib/Target/Alpha/AlphaISelPattern.cpp @@ -1216,7 +1216,8 @@ unsigned AlphaISel::SelectExpr(SDOperand N) { return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); AlphaLowering.restoreGP(BB); Tmp2 = MakeReg(MVT::i64); BuildMI(BB, Alpha::LDAHr, 2, Tmp2).addConstantPoolIndex(Tmp1) @@ -1285,16 +1286,18 @@ unsigned AlphaISel::SelectExpr(SDOperand N) { .addGlobalAddress(GASD->getGlobal()).addReg(Tmp1); } else if (ConstantPoolSDNode *CP = dyn_cast(Address)) { + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); AlphaLowering.restoreGP(BB); has_sym = true; Tmp1 = MakeReg(MVT::i64); - BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CP->getIndex()) + BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CPIdx) .addReg(Alpha::R29); if (EnableAlphaLSMark) BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k) .addImm(getUID()); BuildMI(BB, GetRelVersion(Opc), 2, Result) - .addConstantPoolIndex(CP->getIndex()).addReg(Tmp1); + .addConstantPoolIndex(CPIdx).addReg(Tmp1); } else if(Address.getOpcode() == ISD::FrameIndex) { if (EnableAlphaLSMark) BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k) diff --git a/lib/Target/IA64/IA64ISelPattern.cpp b/lib/Target/IA64/IA64ISelPattern.cpp index c0af3427164..32aa94ac58b 100644 --- a/lib/Target/IA64/IA64ISelPattern.cpp +++ b/lib/Target/IA64/IA64ISelPattern.cpp @@ -956,7 +956,8 @@ unsigned ISel::SelectExpr(SDOperand N) { } case ISD::ConstantPool: { - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); IA64Lowering.restoreGP(BB); // FIXME: do i really need this? BuildMI(BB, IA64::ADD, 2, Result).addConstantPoolIndex(Tmp1) .addReg(IA64::r1); @@ -1974,10 +1975,12 @@ pC = pA OR pB BuildMI(BB, IA64::CMPNE, 2, Result).addReg(dummy3).addReg(IA64::r0); } } else if(ConstantPoolSDNode *CP = dyn_cast(Address)) { + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); Select(Chain); IA64Lowering.restoreGP(BB); unsigned dummy = MakeReg(MVT::i64); - BuildMI(BB, IA64::ADD, 2, dummy).addConstantPoolIndex(CP->getIndex()) + BuildMI(BB, IA64::ADD, 2, dummy).addConstantPoolIndex(CPIdx) .addReg(IA64::r1); // CPI+GP if(!isBool) BuildMI(BB, Opc, 1, Result).addReg(dummy); diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 8c1e6cbf8bf..2ae44ce461c 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -15,7 +15,6 @@ #include "PowerPC.h" #include "PPC32TargetMachine.h" #include "PPC32ISelLowering.h" -#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SSARegMap.h" @@ -696,11 +695,9 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { break; } case ISD::ConstantFP: { // FIXME: this should get sucked into the legalizer - MachineConstantPool *CP = CurDAG->getMachineFunction().getConstantPool(); Constant *CFP = ConstantFP::get(Type::FloatTy, cast(N)->getValue()); - SDOperand CPN = CurDAG->getConstantPool(CP->getConstantPoolIndex(CFP), - MVT::i32); + SDOperand CPN = CurDAG->getConstantPool(CFP, MVT::i32); SDOperand Tmp; if (PICEnabled) Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPN); @@ -723,8 +720,8 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { break; } case ISD::ConstantPool: { - unsigned CPIIdx = cast(N)->getIndex(); - SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(CPIIdx, MVT::i32); + Constant *C = cast(N)->get(); + SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(C, MVT::i32); if (PICEnabled) Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPI); else diff --git a/lib/Target/PowerPC/PPCISelPattern.cpp b/lib/Target/PowerPC/PPCISelPattern.cpp index 3187e4a349c..7ff5eb9c13c 100644 --- a/lib/Target/PowerPC/PPCISelPattern.cpp +++ b/lib/Target/PowerPC/PPCISelPattern.cpp @@ -866,7 +866,8 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) { return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); Tmp2 = MakeIntReg(); if (PICEnabled) BuildMI(BB, PPC::ADDIS, 2, Tmp2).addReg(getGlobalBaseReg()) @@ -927,7 +928,8 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) { if (ConstantPoolSDNode *CP = dyn_cast(Address)) { Tmp1 = MakeIntReg(); - int CPI = CP->getIndex(); + unsigned CPI = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); if (PICEnabled) BuildMI(BB, PPC::ADDIS, 2, Tmp1).addReg(getGlobalBaseReg()) .addConstantPoolIndex(CPI); diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp index ff0ee633ff9..9f602418aba 100644 --- a/lib/Target/X86/X86ISelPattern.cpp +++ b/lib/Target/X86/X86ISelPattern.cpp @@ -2329,7 +2329,8 @@ unsigned ISel::SelectExpr(SDOperand N) { addFrameReference(BuildMI(BB, X86::LEA32r, 4, Result), (int)Tmp1); return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); addConstantPoolReference(BuildMI(BB, X86::LEA32r, 4, Result), Tmp1); return Result; case ISD::ConstantFP: @@ -3317,8 +3318,10 @@ unsigned ISel::SelectExpr(SDOperand N) { } if (ConstantPoolSDNode *CP = dyn_cast(N.getOperand(1))){ + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); Select(N.getOperand(0)); - addConstantPoolReference(BuildMI(BB, Opc, 4, Result), CP->getIndex()); + addConstantPoolReference(BuildMI(BB, Opc, 4, Result), CPIdx); } else { X86AddressMode AM; @@ -3370,8 +3373,10 @@ unsigned ISel::SelectExpr(SDOperand N) { if (Node->getValueType(0) == MVT::f64) { assert(cast(Node->getOperand(3))->getVT() == MVT::f32 && "Bad EXTLOAD!"); - addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), - CP->getIndex()); + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); + + addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), CPIdx); return Result; } -- 2.34.1