aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp169
1 files changed, 107 insertions, 62 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 3f262df713..14ae80171c 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -472,6 +472,11 @@ static void AddNodeIDNode(FoldingSetNodeID &ID, SDNode *N) {
// SelectionDAG Class
//===----------------------------------------------------------------------===//
+inline alist_traits<SDNode, LargestSDNode>::AllocatorType &
+SelectionDAG::getAllocator() {
+ return AllNodes.getTraits().Allocator;
+}
+
/// RemoveDeadNodes - This method deletes all unreachable nodes in the
/// SelectionDAG.
void SelectionDAG::RemoveDeadNodes() {
@@ -549,9 +554,6 @@ void SelectionDAG::DeleteNode(SDNode *N) {
void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
- // Remove it from the AllNodes list.
- AllNodes.remove(N);
-
// Drop all of the operands and decrement used nodes use counts.
for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I)
I->getVal()->removeUser(std::distance(N->op_begin(), I), N);
@@ -561,7 +563,7 @@ void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
N->OperandList = 0;
N->NumOperands = 0;
- delete N;
+ AllNodes.erase(N);
}
/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
@@ -754,7 +756,8 @@ SDOperand SelectionDAG::getConstant(const APInt &Val, MVT VT, bool isT) {
if (!VT.isVector())
return SDOperand(N, 0);
if (!N) {
- N = new ConstantSDNode(isT, Val, EltVT);
+ N = getAllocator().Allocate<ConstantSDNode>();
+ new (N) ConstantSDNode(isT, Val, EltVT);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
}
@@ -792,7 +795,8 @@ SDOperand SelectionDAG::getConstantFP(const APFloat& V, MVT VT, bool isTarget) {
if (!VT.isVector())
return SDOperand(N, 0);
if (!N) {
- N = new ConstantFPSDNode(isTarget, V, EltVT);
+ N = getAllocator().Allocate<ConstantFPSDNode>();
+ new (N) ConstantFPSDNode(isTarget, V, EltVT);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
}
@@ -839,7 +843,8 @@ SDOperand SelectionDAG::getGlobalAddress(const GlobalValue *GV,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new GlobalAddressSDNode(isTargetGA, GV, VT, Offset);
+ SDNode *N = getAllocator().Allocate<GlobalAddressSDNode>();
+ new (N) GlobalAddressSDNode(isTargetGA, GV, VT, Offset);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -853,7 +858,8 @@ SDOperand SelectionDAG::getFrameIndex(int FI, MVT VT, bool isTarget) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new FrameIndexSDNode(FI, VT, isTarget);
+ SDNode *N = getAllocator().Allocate<FrameIndexSDNode>();
+ new (N) FrameIndexSDNode(FI, VT, isTarget);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -867,7 +873,8 @@ SDOperand SelectionDAG::getJumpTable(int JTI, MVT VT, bool isTarget){
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new JumpTableSDNode(JTI, VT, isTarget);
+ SDNode *N = getAllocator().Allocate<JumpTableSDNode>();
+ new (N) JumpTableSDNode(JTI, VT, isTarget);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -885,7 +892,8 @@ SDOperand SelectionDAG::getConstantPool(Constant *C, MVT VT,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
+ SDNode *N = getAllocator().Allocate<ConstantPoolSDNode>();
+ new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -904,7 +912,8 @@ SDOperand SelectionDAG::getConstantPool(MachineConstantPoolValue *C, MVT VT,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
+ SDNode *N = getAllocator().Allocate<ConstantPoolSDNode>();
+ new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -918,7 +927,8 @@ SDOperand SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new BasicBlockSDNode(MBB);
+ SDNode *N = getAllocator().Allocate<BasicBlockSDNode>();
+ new (N) BasicBlockSDNode(MBB);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -931,7 +941,8 @@ SDOperand SelectionDAG::getArgFlags(ISD::ArgFlagsTy Flags) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new ARG_FLAGSSDNode(Flags);
+ SDNode *N = getAllocator().Allocate<ARG_FLAGSSDNode>();
+ new (N) ARG_FLAGSSDNode(Flags);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -945,7 +956,8 @@ SDOperand SelectionDAG::getValueType(MVT VT) {
ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT()];
if (N) return SDOperand(N, 0);
- N = new VTSDNode(VT);
+ N = getAllocator().Allocate<VTSDNode>();
+ new (N) VTSDNode(VT);
AllNodes.push_back(N);
return SDOperand(N, 0);
}
@@ -953,7 +965,8 @@ SDOperand SelectionDAG::getValueType(MVT VT) {
SDOperand SelectionDAG::getExternalSymbol(const char *Sym, MVT VT) {
SDNode *&N = ExternalSymbols[Sym];
if (N) return SDOperand(N, 0);
- N = new ExternalSymbolSDNode(false, Sym, VT);
+ N = getAllocator().Allocate<ExternalSymbolSDNode>();
+ new (N) ExternalSymbolSDNode(false, Sym, VT);
AllNodes.push_back(N);
return SDOperand(N, 0);
}
@@ -961,7 +974,8 @@ SDOperand SelectionDAG::getExternalSymbol(const char *Sym, MVT VT) {
SDOperand SelectionDAG::getTargetExternalSymbol(const char *Sym, MVT VT) {
SDNode *&N = TargetExternalSymbols[Sym];
if (N) return SDOperand(N, 0);
- N = new ExternalSymbolSDNode(true, Sym, VT);
+ N = getAllocator().Allocate<ExternalSymbolSDNode>();
+ new (N) ExternalSymbolSDNode(true, Sym, VT);
AllNodes.push_back(N);
return SDOperand(N, 0);
}
@@ -971,8 +985,10 @@ SDOperand SelectionDAG::getCondCode(ISD::CondCode Cond) {
CondCodeNodes.resize(Cond+1);
if (CondCodeNodes[Cond] == 0) {
- CondCodeNodes[Cond] = new CondCodeSDNode(Cond);
- AllNodes.push_back(CondCodeNodes[Cond]);
+ CondCodeSDNode *N = getAllocator().Allocate<CondCodeSDNode>();
+ new (N) CondCodeSDNode(Cond);
+ CondCodeNodes[Cond] = N;
+ AllNodes.push_back(N);
}
return SDOperand(CondCodeNodes[Cond], 0);
}
@@ -984,7 +1000,8 @@ SDOperand SelectionDAG::getRegister(unsigned RegNo, MVT VT) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new RegisterSDNode(RegNo, VT);
+ SDNode *N = getAllocator().Allocate<RegisterSDNode>();
+ new (N) RegisterSDNode(RegNo, VT);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -1002,7 +1019,8 @@ SDOperand SelectionDAG::getDbgStopPoint(SDOperand Root,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new DbgStopPointSDNode(Root, Line, Col, CU);
+ SDNode *N = getAllocator().Allocate<DbgStopPointSDNode>();
+ new (N) DbgStopPointSDNode(Root, Line, Col, CU);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -1018,7 +1036,8 @@ SDOperand SelectionDAG::getLabel(unsigned Opcode,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new LabelSDNode(Opcode, Root, LabelID);
+ SDNode *N = getAllocator().Allocate<LabelSDNode>();
+ new (N) LabelSDNode(Opcode, Root, LabelID);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -1036,7 +1055,8 @@ SDOperand SelectionDAG::getSrcValue(const Value *V) {
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new SrcValueSDNode(V);
+ SDNode *N = getAllocator().Allocate<SrcValueSDNode>();
+ new (N) SrcValueSDNode(V);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -1059,7 +1079,8 @@ SDOperand SelectionDAG::getMemOperand(const MachineMemOperand &MO) {
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new MemOperandSDNode(MO);
+ SDNode *N = getAllocator().Allocate<MemOperandSDNode>();
+ new (N) MemOperandSDNode(MO);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -1911,7 +1932,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT VT) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new SDNode(Opcode, SDNode::getSDVTList(VT));
+ SDNode *N = getAllocator().Allocate<SDNode>();
+ new (N) SDNode(Opcode, SDNode::getSDVTList(VT));
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
@@ -2104,10 +2126,12 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT VT, SDOperand Operand) {
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new UnarySDNode(Opcode, VTs, Operand);
+ N = getAllocator().Allocate<UnarySDNode>();
+ new (N) UnarySDNode(Opcode, VTs, Operand);
CSEMap.InsertNode(N, IP);
} else {
- N = new UnarySDNode(Opcode, VTs, Operand);
+ N = getAllocator().Allocate<UnarySDNode>();
+ new (N) UnarySDNode(Opcode, VTs, Operand);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -2454,10 +2478,12 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT VT,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new BinarySDNode(Opcode, VTs, N1, N2);
+ N = getAllocator().Allocate<BinarySDNode>();
+ new (N) BinarySDNode(Opcode, VTs, N1, N2);
CSEMap.InsertNode(N, IP);
} else {
- N = new BinarySDNode(Opcode, VTs, N1, N2);
+ N = getAllocator().Allocate<BinarySDNode>();
+ new (N) BinarySDNode(Opcode, VTs, N1, N2);
}
AllNodes.push_back(N);
@@ -2518,10 +2544,12 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT VT,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new TernarySDNode(Opcode, VTs, N1, N2, N3);
+ N = getAllocator().Allocate<TernarySDNode>();
+ new (N) TernarySDNode(Opcode, VTs, N1, N2, N3);
CSEMap.InsertNode(N, IP);
} else {
- N = new TernarySDNode(Opcode, VTs, N1, N2, N3);
+ N = getAllocator().Allocate<TernarySDNode>();
+ new (N) TernarySDNode(Opcode, VTs, N1, N2, N3);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3029,8 +3057,8 @@ SDOperand SelectionDAG::getAtomic(unsigned Opcode, SDOperand Chain,
void* IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, Cmp, Swp,
- PtrVal, Alignment);
+ SDNode* N = getAllocator().Allocate<AtomicSDNode>();
+ new (N) AtomicSDNode(Opcode, VTs, Chain, Ptr, Cmp, Swp, PtrVal, Alignment);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3054,8 +3082,8 @@ SDOperand SelectionDAG::getAtomic(unsigned Opcode, SDOperand Chain,
void* IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode* N = new AtomicSDNode(Opcode, VTs, Chain, Ptr, Val,
- PtrVal, Alignment);
+ SDNode* N = getAllocator().Allocate<AtomicSDNode>();
+ new (N) AtomicSDNode(Opcode, VTs, Chain, Ptr, Val, PtrVal, Alignment);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3128,8 +3156,9 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new LoadSDNode(Ops, VTs, AM, ExtType, EVT, SV, SVOffset,
- Alignment, isVolatile);
+ SDNode *N = getAllocator().Allocate<LoadSDNode>();
+ new (N) LoadSDNode(Ops, VTs, AM, ExtType, EVT, SV, SVOffset,
+ Alignment, isVolatile);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3196,8 +3225,9 @@ SDOperand SelectionDAG::getStore(SDOperand Chain, SDOperand Val,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, VTs, ISD::UNINDEXED, false,
- VT, SV, SVOffset, Alignment, isVolatile);
+ SDNode *N = getAllocator().Allocate<StoreSDNode>();
+ new (N) StoreSDNode(Ops, VTs, ISD::UNINDEXED, false,
+ VT, SV, SVOffset, Alignment, isVolatile);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3241,8 +3271,9 @@ SDOperand SelectionDAG::getTruncStore(SDOperand Chain, SDOperand Val,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, VTs, ISD::UNINDEXED, true,
- SVT, SV, SVOffset, Alignment, isVolatile);
+ SDNode *N = getAllocator().Allocate<StoreSDNode>();
+ new (N) StoreSDNode(Ops, VTs, ISD::UNINDEXED, true,
+ SVT, SV, SVOffset, Alignment, isVolatile);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3266,10 +3297,11 @@ SelectionDAG::getIndexedStore(SDOperand OrigStore, SDOperand Base,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, VTs, AM,
- ST->isTruncatingStore(), ST->getMemoryVT(),
- ST->getSrcValue(), ST->getSrcValueOffset(),
- ST->getAlignment(), ST->isVolatile());
+ SDNode *N = getAllocator().Allocate<StoreSDNode>();
+ new (N) StoreSDNode(Ops, VTs, AM,
+ ST->isTruncatingStore(), ST->getMemoryVT(),
+ ST->getSrcValue(), ST->getSrcValueOffset(),
+ ST->getAlignment(), ST->isVolatile());
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3342,10 +3374,12 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT VT,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, VTs, Ops, NumOps);
+ N = getAllocator().Allocate<SDNode>();
+ new (N) SDNode(Opcode, VTs, Ops, NumOps);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, VTs, Ops, NumOps);
+ N = getAllocator().Allocate<SDNode>();
+ new (N) SDNode(Opcode, VTs, Ops, NumOps);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -3402,24 +3436,34 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, SDVTList VTList,
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- if (NumOps == 1)
- N = new UnarySDNode(Opcode, VTList, Ops[0]);
- else if (NumOps == 2)
- N = new BinarySDNode(Opcode, VTList, Ops[0], Ops[1]);
- else if (NumOps == 3)
- N = new TernarySDNode(Opcode, VTList, Ops[0], Ops[1], Ops[2]);
- else
- N = new SDNode(Opcode, VTList, Ops, NumOps);
+ if (NumOps == 1) {
+ N = getAllocator().Allocate<UnarySDNode>();
+ new (N) UnarySDNode(Opcode, VTList, Ops[0]);
+ } else if (NumOps == 2) {
+ N = getAllocator().Allocate<BinarySDNode>();
+ new (N) BinarySDNode(Opcode, VTList, Ops[0], Ops[1]);
+ } else if (NumOps == 3) {
+ N = getAllocator().Allocate<TernarySDNode>();
+ new (N) TernarySDNode(Opcode, VTList, Ops[0], Ops[1], Ops[2]);
+ } else {
+ N = getAllocator().Allocate<SDNode>();
+ new (N) SDNode(Opcode, VTList, Ops, NumOps);
+ }
CSEMap.InsertNode(N, IP);
} else {
- if (NumOps == 1)
- N = new UnarySDNode(Opcode, VTList, Ops[0]);
- else if (NumOps == 2)
- N = new BinarySDNode(Opcode, VTList, Ops[0], Ops[1]);
- else if (NumOps == 3)
- N = new TernarySDNode(Opcode, VTList, Ops[0], Ops[1], Ops[2]);
- else
- N = new SDNode(Opcode, VTList, Ops, NumOps);
+ if (NumOps == 1) {
+ N = getAllocator().Allocate<UnarySDNode>();
+ new (N) UnarySDNode(Opcode, VTList, Ops[0]);
+ } else if (NumOps == 2) {
+ N = getAllocator().Allocate<BinarySDNode>();
+ new (N) BinarySDNode(Opcode, VTList, Ops[0], Ops[1]);
+ } else if (NumOps == 3) {
+ N = getAllocator().Allocate<TernarySDNode>();
+ new (N) TernarySDNode(Opcode, VTList, Ops[0], Ops[1], Ops[2]);
+ } else {
+ N = getAllocator().Allocate<SDNode>();
+ new (N) SDNode(Opcode, VTList, Ops, NumOps);
+ }
}
AllNodes.push_back(N);
return SDOperand(N, 0);
@@ -4203,6 +4247,7 @@ unsigned SelectionDAG::AssignTopologicalOrder(std::vector<SDNode*> &TopOrder) {
}
TopOrder.clear();
+ TopOrder.reserve(DAGSize);
while (!Sources.empty()) {
SDNode *N = Sources.back();
Sources.pop_back();