44 enum class MatchState {
53 UnchangedMismatch = 4,
55 RecoveredMismatch = 5,
89 std::shared_ptr<ProfileSymbolList> PSL;
101 uint64_t MismatchedFunctionSamples = 0;
102 uint64_t MismatchedCallsiteSamples = 0;
103 uint64_t RecoveredCallsiteSamples = 0;
106 uint64_t NumCallGraphRecoveredProfiledFunc = 0;
107 uint64_t NumCallGraphRecoveredFuncSamples = 0;
111 static constexpr const char *UnknownIndirectCallee =
112 "unknown.indirect.callee";
119 std::shared_ptr<ProfileSymbolList> PSL,
121 : M(M), Reader(Reader), CG(CG), ProbeManager(ProbeManager),
122 LTOPhase(LTOPhase), FuncNameToProfNameMap(&FuncNameToProfNameMap),
123 SymbolMap(&
SymMap), PSL(PSL) {};
131 freeContainer(FuncCallsiteMatchStates);
132 freeContainer(FunctionsWithoutProfile);
133 freeContainer(FuncToProfileNameMap);
138 auto It = FlattenedProfiles.
find(Fname);
139 if (It != FlattenedProfiles.end())
143 FunctionSamples *getFlattenedSamplesFor(
const Function &
F) {
145 return getFlattenedSamplesFor(FunctionId(CanonFName));
147 template <
typename T>
inline void freeContainer(
T &
C) {
151 void getFilteredAnchorList(
const AnchorMap &IRAnchors,
155 void runOnFunction(Function &
F);
156 void findIRAnchors(
const Function &
F,
AnchorMap &IRAnchors)
const;
157 void findProfileAnchors(
const FunctionSamples &FS,
161 void recordCallsiteMatchStates(
const Function &
F,
const AnchorMap &IRAnchors,
165 bool isMismatchState(
const enum MatchState &State) {
166 return State == MatchState::InitialMismatch ||
167 State == MatchState::UnchangedMismatch ||
168 State == MatchState::RemovedMatch;
171 bool isInitialState(
const enum MatchState &State) {
172 return State == MatchState::InitialMatch ||
173 State == MatchState::InitialMismatch;
176 bool isFinalState(
const enum MatchState &State) {
177 return State == MatchState::UnchangedMatch ||
178 State == MatchState::UnchangedMismatch ||
179 State == MatchState::RecoveredMismatch ||
180 State == MatchState::RemovedMatch;
184 countCallGraphRecoveredSamples(
const FunctionSamples &FS,
185 DenseSet<FunctionId> &MatchedUnusedProfile);
188 void countMismatchedFuncSamples(
const FunctionSamples &FS,
bool IsTopLevel);
190 void countMismatchCallsites(
const FunctionSamples &FS);
193 void countMismatchedCallsiteSamples(
const FunctionSamples &FS);
194 void computeAndReportProfileStaleness();
195 void UpdateWithSalvagedProfiles();
197 LocToLocMap &getIRToProfileLocationMap(
const FunctionSamples &FS) {
198 return FuncMappings[
FS.getFuncName()];
200 void distributeIRToProfileLocationMap();
201 void distributeIRToProfileLocationMap(FunctionSamples &FS);
204 bool MatchUnusedFunction);
205 void matchNonCallsiteLocs(
const LocToLocMap &AnchorMatchings,
208 void runStaleProfileMatching(
const Function &
F,
const AnchorMap &IRAnchors,
211 bool RunCFGMatching,
bool RunCGMatching);
213 bool functionHasProfile(
const FunctionId &IRFuncName,
214 Function *&FuncWithoutProfile);
215 bool isProfileUnused(
const FunctionId &ProfileFuncName);
216 bool functionMatchesProfileHelper(
const Function &IRFunc,
217 const FunctionId &ProfFunc);
221 bool functionMatchesProfile(
const FunctionId &IRFuncName,
222 const FunctionId &ProfileFuncName,
223 bool FindMatchedProfileOnly);
227 bool functionMatchesProfile(Function &IRFunc,
const FunctionId &ProfFunc,
228 bool FindMatchedProfileOnly);
232 void findFunctionsWithoutProfile();
235 void matchFunctionsWithoutProfileByBasename();
236 void reportOrPersistProfileStats();
SampleProfileMatcher(Module &M, SampleProfileReader &Reader, LazyCallGraph &CG, const PseudoProbeManager *ProbeManager, ThinOrFullLTOPhase LTOPhase, HashKeyMap< DenseMap, FunctionId, Function * > &SymMap, std::shared_ptr< ProfileSymbolList > PSL, HashKeyMap< DenseMap, FunctionId, FunctionId > &FuncNameToProfNameMap)