@@ -619,6 +619,16 @@ class CallsiteContextGraph {
619
619
return static_cast <const DerivedCCG *>(this )->getLabel (Func, Call, CloneNo);
620
620
}
621
621
622
+ // Create and return a new ContextNode.
623
+ ContextNode *createNewNode (bool IsAllocation, const FuncTy *F = nullptr ,
624
+ CallInfo C = CallInfo()) {
625
+ NodeOwner.push_back (std::make_unique<ContextNode>(IsAllocation, C));
626
+ auto *NewNode = NodeOwner.back ().get ();
627
+ if (F)
628
+ NodeToCallingFunc[NewNode] = F;
629
+ return NewNode;
630
+ }
631
+
622
632
// / Helpers to find the node corresponding to the given call or stackid.
623
633
ContextNode *getNodeForInst (const CallInfo &C);
624
634
ContextNode *getNodeForAlloc (const CallInfo &C);
@@ -1082,11 +1092,8 @@ typename CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::ContextNode *
1082
1092
CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::addAllocNode(
1083
1093
CallInfo Call, const FuncTy *F) {
1084
1094
assert (!getNodeForAlloc (Call));
1085
- NodeOwner.push_back (
1086
- std::make_unique<ContextNode>(/* IsAllocation=*/ true , Call));
1087
- ContextNode *AllocNode = NodeOwner.back ().get ();
1095
+ ContextNode *AllocNode = createNewNode (/* IsAllocation=*/ true , F, Call);
1088
1096
AllocationCallToContextNodeMap[Call] = AllocNode;
1089
- NodeToCallingFunc[AllocNode] = F;
1090
1097
// Use LastContextId as a uniq id for MIB allocation nodes.
1091
1098
AllocNode->OrigStackOrAllocId = LastContextId;
1092
1099
// Alloc type should be updated as we add in the MIBs. We should assert
@@ -1143,9 +1150,7 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::addStackNodesForMIB(
1143
1150
auto StackId = getStackId (*ContextIter);
1144
1151
ContextNode *StackNode = getNodeForStackId (StackId);
1145
1152
if (!StackNode) {
1146
- NodeOwner.push_back (
1147
- std::make_unique<ContextNode>(/* IsAllocation=*/ false ));
1148
- StackNode = NodeOwner.back ().get ();
1153
+ StackNode = createNewNode (/* IsAllocation=*/ false );
1149
1154
StackEntryIdToContextNodeMap[StackId] = StackNode;
1150
1155
StackNode->OrigStackOrAllocId = StackId;
1151
1156
}
@@ -1448,10 +1453,7 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::
1448
1453
continue ;
1449
1454
1450
1455
// Create new context node.
1451
- NodeOwner.push_back (
1452
- std::make_unique<ContextNode>(/* IsAllocation=*/ false , Call));
1453
- ContextNode *NewNode = NodeOwner.back ().get ();
1454
- NodeToCallingFunc[NewNode] = Func;
1456
+ ContextNode *NewNode = createNewNode (/* IsAllocation=*/ false , Func, Call);
1455
1457
NonAllocationCallToContextNodeMap[Call] = NewNode;
1456
1458
CreatedNode = true ;
1457
1459
NewNode->AllocTypes = computeAllocType (SavedContextIds);
@@ -2164,10 +2166,7 @@ bool CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::calleesMatch(
2164
2166
} else {
2165
2167
FuncToCallsWithMetadata[Func].push_back ({NewCall});
2166
2168
// Create Node and record node info.
2167
- NodeOwner.push_back (
2168
- std::make_unique<ContextNode>(/* IsAllocation=*/ false , NewCall));
2169
- NewNode = NodeOwner.back ().get ();
2170
- NodeToCallingFunc[NewNode] = Func;
2169
+ NewNode = createNewNode (/* IsAllocation=*/ false , Func, NewCall);
2171
2170
TailCallToContextNodeMap[NewCall] = NewNode;
2172
2171
NewNode->AllocTypes = Edge->AllocTypes ;
2173
2172
}
@@ -2740,13 +2739,11 @@ CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::moveEdgeToNewCalleeClone(
2740
2739
const std::shared_ptr<ContextEdge> &Edge, EdgeIter *CallerEdgeI,
2741
2740
DenseSet<uint32_t > ContextIdsToMove) {
2742
2741
ContextNode *Node = Edge->Callee ;
2743
- NodeOwner. push_back (
2744
- std::make_unique< ContextNode>(Node-> IsAllocation , Node-> Call ));
2745
- ContextNode *Clone = NodeOwner. back (). get ( );
2742
+ assert (NodeToCallingFunc. count (Node));
2743
+ ContextNode *Clone =
2744
+ createNewNode (Node-> IsAllocation , NodeToCallingFunc[Node], Node-> Call );
2746
2745
Node->addClone (Clone);
2747
2746
Clone->MatchingCalls = Node->MatchingCalls ;
2748
- assert (NodeToCallingFunc.count (Node));
2749
- NodeToCallingFunc[Clone] = NodeToCallingFunc[Node];
2750
2747
moveEdgeToExistingCalleeClone (Edge, Clone, CallerEdgeI, /* NewClone=*/ true ,
2751
2748
ContextIdsToMove);
2752
2749
return Clone;
0 commit comments