Skip to content

Commit af4ffc1

Browse files
[Prototype] Trace whole reachable call path
1 parent 89d9b4d commit af4ffc1

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

tools/driver/cross_module_opt_main.cpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,18 @@ void markDeadSymbols(ModuleSummaryIndex &summary, llvm::DenseSet<GUID> &Preserve
160160
unsigned LiveSymbols = 0;
161161

162162
for (auto GUID : PreservedGUIDs) {
163-
Worklist.push_back(std::make_shared<LivenessTrace>(
164-
nullptr, GUID, LivenessTrace::Preserved));
163+
auto trace = std::make_shared<LivenessTrace>(
164+
nullptr, GUID, LivenessTrace::Preserved);
165+
auto maybeFS = summary.getFunctionSummary(GUID);
166+
if (!maybeFS) {
167+
llvm_unreachable("Bad GUID");
168+
}
169+
if (!maybeFS->getName().empty()) {
170+
trace->setName(maybeFS->getName());
171+
}
172+
Worklist.push_back(trace);
165173
}
166-
std::shared_ptr<LivenessTrace> dumpTarget;
174+
std::set<std::shared_ptr<LivenessTrace>> dumpTargets;
167175
while (!Worklist.empty()) {
168176
auto trace = Worklist.pop_back_val();
169177

@@ -172,12 +180,6 @@ void markDeadSymbols(ModuleSummaryIndex &summary, llvm::DenseSet<GUID> &Preserve
172180
llvm_unreachable("Bad GUID");
173181
}
174182
auto FS = maybeSummary;
175-
if (!FS->getName().empty()) {
176-
trace->setName(FS->getName());
177-
if (LTOPrintLiveTrace == FS->getName()) {
178-
dumpTarget = trace;
179-
}
180-
}
181183
if (FS->isLive()) continue;
182184

183185
if (!FS->getName().empty()) {
@@ -188,10 +190,25 @@ void markDeadSymbols(ModuleSummaryIndex &summary, llvm::DenseSet<GUID> &Preserve
188190
FS->setLive(true);
189191
LiveSymbols++;
190192

193+
auto queueWorklist = [&](std::shared_ptr<LivenessTrace> trace) {
194+
auto maybeCallee = summary.getFunctionSummary(trace->guid);
195+
if (!maybeCallee) {
196+
llvm_unreachable("Bad GUID");
197+
}
198+
auto Callee = maybeCallee;
199+
if (!Callee->getName().empty()) {
200+
trace->setName(Callee->getName());
201+
if (LTOPrintLiveTrace == Callee->getName()) {
202+
dumpTargets.insert(trace);
203+
}
204+
}
205+
Worklist.push_back(trace);
206+
};
207+
191208
for (auto Call : FS->calls()) {
192209
switch (Call.getKind()) {
193210
case FunctionSummary::Call::Direct: {
194-
Worklist.push_back(std::make_shared<LivenessTrace>(
211+
queueWorklist(std::make_shared<LivenessTrace>(
195212
trace, Call.getCallee(), LivenessTrace::StaticReferenced));
196213
continue;
197214
}
@@ -203,7 +220,7 @@ void markDeadSymbols(ModuleSummaryIndex &summary, llvm::DenseSet<GUID> &Preserve
203220
if (UsedTypesSet.find(Impl.TypeGuid) == UsedTypesSet.end()) {
204221
continue;
205222
}
206-
Worklist.push_back(std::make_shared<LivenessTrace>(
223+
queueWorklist(std::make_shared<LivenessTrace>(
207224
trace, Impl.Guid, LivenessTrace::IndirectReferenced));
208225
}
209226
break;
@@ -213,7 +230,7 @@ void markDeadSymbols(ModuleSummaryIndex &summary, llvm::DenseSet<GUID> &Preserve
213230
}
214231
}
215232
}
216-
if (dumpTarget) {
233+
for (auto dumpTarget : dumpTargets) {
217234
dumpTarget->dump();
218235
}
219236
}

0 commit comments

Comments
 (0)