diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-29 11:18:56 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-09-29 11:18:56 +0000 |
commit | c3c807b3bff305ab4befce71aca574bcd08853f3 (patch) | |
tree | a06cb27af8126ee739ab5531112b3199d108cef9 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | fbf4a54a434e1461fa29cd0e16e54ab88407d708 (diff) | |
download | bcm5719-llvm-c3c807b3bff305ab4befce71aca574bcd08853f3.tar.gz bcm5719-llvm-c3c807b3bff305ab4befce71aca574bcd08853f3.zip |
Allocate AtomicSDNode operands in SelectionDAG's allocator to stop leakage.
SDNode destructors are never called. As an optimization use AtomicSDNode's
internal storage if we have a small number of operands.
llvm-svn: 191636
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index b96c4b18d11..62ceb8b3a25 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -4125,10 +4125,18 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, cast<AtomicSDNode>(E)->refineAlignment(MMO); return SDValue(E, 0); } + + // Allocate the operands array for the node out of the BumpPtrAllocator, since + // SDNode doesn't have access to it. This memory will be "leaked" when + // the node is deallocated, but recovered when the allocator is released. + // If the number of operands is less than 5 we use AtomicSDNode's internal + // storage. + SDUse *DynOps = NumOps > 4 ? OperandAllocator.Allocate<SDUse>(NumOps) : 0; + SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTList, MemVT, - Ops, NumOps, MMO, Ordering, - SynchScope); + Ops, DynOps, NumOps, MMO, + Ordering, SynchScope); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); return SDValue(N, 0); |