mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
SDAG: Give SDDbgValues their own allocator (and reset it)
Previously `SDDbgValue`s used the general allocator that lives for all of `SelectionDAG`. Instead, give them their own allocator, and reset it whenever `SDDbgInfo::clear()` is called, plugging a spiritual leak. This drops `SelectionDAGBuilder::visitIntrinsicCall()` off of my heap profile (was at around 2% of `llc` for codegen of `-flto -g`). Thanks to Pete Cooper for spotting the problem and suggesting the fix. llvm-svn: 237998
This commit is contained in:
parent
116c89859d
commit
d24ab51c79
@ -112,6 +112,7 @@ private:
|
||||
/// motion, and debug info for them is potentially useful even if the parameter
|
||||
/// is unused. Right now only byval parameters are handled separately.
|
||||
class SDDbgInfo {
|
||||
BumpPtrAllocator Alloc;
|
||||
SmallVector<SDDbgValue*, 32> DbgValues;
|
||||
SmallVector<SDDbgValue*, 32> ByvalParmDbgValues;
|
||||
typedef DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> > DbgValMapType;
|
||||
@ -138,8 +139,11 @@ public:
|
||||
DbgValMap.clear();
|
||||
DbgValues.clear();
|
||||
ByvalParmDbgValues.clear();
|
||||
Alloc.Reset();
|
||||
}
|
||||
|
||||
BumpPtrAllocator &getAlloc() { return Alloc; }
|
||||
|
||||
bool empty() const {
|
||||
return DbgValues.empty() && ByvalParmDbgValues.empty();
|
||||
}
|
||||
|
@ -6055,7 +6055,8 @@ SDDbgValue *SelectionDAG::getDbgValue(MDNode *Var, MDNode *Expr, SDNode *N,
|
||||
DebugLoc DL, unsigned O) {
|
||||
assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
|
||||
"Expected inlined-at fields to agree");
|
||||
return new (Allocator) SDDbgValue(Var, Expr, N, R, IsIndirect, Off, DL, O);
|
||||
return new (DbgInfo->getAlloc())
|
||||
SDDbgValue(Var, Expr, N, R, IsIndirect, Off, DL, O);
|
||||
}
|
||||
|
||||
/// Constant
|
||||
@ -6064,7 +6065,7 @@ SDDbgValue *SelectionDAG::getConstantDbgValue(MDNode *Var, MDNode *Expr,
|
||||
DebugLoc DL, unsigned O) {
|
||||
assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
|
||||
"Expected inlined-at fields to agree");
|
||||
return new (Allocator) SDDbgValue(Var, Expr, C, Off, DL, O);
|
||||
return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, C, Off, DL, O);
|
||||
}
|
||||
|
||||
/// FrameIndex
|
||||
@ -6073,7 +6074,7 @@ SDDbgValue *SelectionDAG::getFrameIndexDbgValue(MDNode *Var, MDNode *Expr,
|
||||
DebugLoc DL, unsigned O) {
|
||||
assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
|
||||
"Expected inlined-at fields to agree");
|
||||
return new (Allocator) SDDbgValue(Var, Expr, FI, Off, DL, O);
|
||||
return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, FI, Off, DL, O);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
Loading…
Reference in New Issue
Block a user