41 enum class MatchState {
50 UnchangedMismatch = 4,
52 RecoveredMismatch = 5,
62 FuncCallsiteMatchStates;
64 struct FuncToProfileNameMapHash {
66 operator()(
const std::pair<const Function *, FunctionId> &
P)
const {
73 std::unordered_map<std::pair<const Function *, FunctionId>,
bool,
74 FuncToProfileNameMapHash>
75 FuncProfileMatchCache;
79 std::unordered_map<Function *, FunctionId> FuncToProfileNameMap;
93 FunctionsWithoutProfile;
96 std::shared_ptr<ProfileSymbolList> PSL;
102 uint64_t TotalProfiledCallsites = 0;
103 uint64_t NumMismatchedCallsites = 0;
108 uint64_t MismatchedFunctionSamples = 0;
109 uint64_t MismatchedCallsiteSamples = 0;
110 uint64_t RecoveredCallsiteSamples = 0;
113 uint64_t NumCallGraphRecoveredProfiledFunc = 0;
114 uint64_t NumCallGraphRecoveredFuncSamples = 0;
118 static constexpr const char *UnknownIndirectCallee =
119 "unknown.indirect.callee";
126 std::shared_ptr<ProfileSymbolList> PSL,
128 &FuncNameToProfNameMap)
129 : M(M), Reader(Reader), CG(CG), ProbeManager(ProbeManager),
130 LTOPhase(LTOPhase), FuncNameToProfNameMap(&FuncNameToProfNameMap),
131 SymbolMap(&
SymMap), PSL(PSL) {};
139 freeContainer(FuncCallsiteMatchStates);
140 freeContainer(FunctionsWithoutProfile);
141 freeContainer(FuncToProfileNameMap);
146 auto It = FlattenedProfiles.
find(Fname);
147 if (It != FlattenedProfiles.end())
151 FunctionSamples *getFlattenedSamplesFor(
const Function &
F) {
153 return getFlattenedSamplesFor(FunctionId(CanonFName));
155 template <
typename T>
inline void freeContainer(
T &
C) {
159 void getFilteredAnchorList(
const AnchorMap &IRAnchors,
163 void runOnFunction(Function &
F);
164 void findIRAnchors(
const Function &
F,
AnchorMap &IRAnchors)
const;
165 void findProfileAnchors(
const FunctionSamples &FS,
169 void recordCallsiteMatchStates(
const Function &
F,
const AnchorMap &IRAnchors,
173 bool isMismatchState(
const enum MatchState &State) {
174 return State == MatchState::InitialMismatch ||
175 State == MatchState::UnchangedMismatch ||
176 State == MatchState::RemovedMatch;
179 bool isInitialState(
const enum MatchState &State) {
180 return State == MatchState::InitialMatch ||
181 State == MatchState::InitialMismatch;
184 bool isFinalState(
const enum MatchState &State) {
185 return State == MatchState::UnchangedMatch ||
186 State == MatchState::UnchangedMismatch ||
187 State == MatchState::RecoveredMismatch ||
188 State == MatchState::RemovedMatch;
191 void countCallGraphRecoveredSamples(
192 const FunctionSamples &FS,
193 std::unordered_set<FunctionId> &MatchedUnusedProfile);
196 void countMismatchedFuncSamples(
const FunctionSamples &FS,
bool IsTopLevel);
198 void countMismatchCallsites(
const FunctionSamples &FS);
201 void countMismatchedCallsiteSamples(
const FunctionSamples &FS);
202 void computeAndReportProfileStaleness();
203 void UpdateWithSalvagedProfiles();
205 LocToLocMap &getIRToProfileLocationMap(
const Function &
F) {
208 void distributeIRToProfileLocationMap();
209 void distributeIRToProfileLocationMap(FunctionSamples &FS);
212 bool MatchUnusedFunction);
213 void matchNonCallsiteLocs(
const LocToLocMap &AnchorMatchings,
216 void runStaleProfileMatching(
const Function &
F,
const AnchorMap &IRAnchors,
219 bool RunCFGMatching,
bool RunCGMatching);
221 bool functionHasProfile(
const FunctionId &IRFuncName,
222 Function *&FuncWithoutProfile);
223 bool isProfileUnused(
const FunctionId &ProfileFuncName);
224 bool functionMatchesProfileHelper(
const Function &IRFunc,
225 const FunctionId &ProfFunc);
229 bool functionMatchesProfile(
const FunctionId &IRFuncName,
230 const FunctionId &ProfileFuncName,
231 bool FindMatchedProfileOnly);
235 bool functionMatchesProfile(Function &IRFunc,
const FunctionId &ProfFunc,
236 bool FindMatchedProfileOnly);
240 void findFunctionsWithoutProfile();
241 void reportOrPersistProfileStats();
SampleProfileMatcher(Module &M, SampleProfileReader &Reader, LazyCallGraph &CG, const PseudoProbeManager *ProbeManager, ThinOrFullLTOPhase LTOPhase, HashKeyMap< std::unordered_map, FunctionId, Function * > &SymMap, std::shared_ptr< ProfileSymbolList > PSL, HashKeyMap< std::unordered_map, FunctionId, FunctionId > &FuncNameToProfNameMap)