39 enum class MatchState {
48 UnchangedMismatch = 4,
50 RecoveredMismatch = 5,
60 FuncCallsiteMatchStates;
62 struct FuncToProfileNameMapHash {
64 operator()(
const std::pair<const Function *, FunctionId> &
P)
const {
71 std::unordered_map<std::pair<const Function *, FunctionId>,
bool,
72 FuncToProfileNameMapHash>
73 FuncProfileMatchCache;
77 std::unordered_map<Function *, FunctionId> FuncToProfileNameMap;
91 FunctionsWithoutProfile;
94 std::shared_ptr<ProfileSymbolList> PSL;
100 uint64_t TotalProfiledCallsites = 0;
101 uint64_t NumMismatchedCallsites = 0;
106 uint64_t MismatchedFunctionSamples = 0;
107 uint64_t MismatchedCallsiteSamples = 0;
108 uint64_t RecoveredCallsiteSamples = 0;
111 uint64_t NumCallGraphRecoveredProfiledFunc = 0;
112 uint64_t NumCallGraphRecoveredFuncSamples = 0;
116 static constexpr const char *UnknownIndirectCallee =
117 "unknown.indirect.callee";
124 std::shared_ptr<ProfileSymbolList> PSL,
126 &FuncNameToProfNameMap)
127 : M(M), Reader(Reader), CG(CG), ProbeManager(ProbeManager),
128 LTOPhase(LTOPhase), FuncNameToProfNameMap(&FuncNameToProfNameMap),
129 SymbolMap(&
SymMap), PSL(PSL) {};
137 freeContainer(FuncCallsiteMatchStates);
138 freeContainer(FunctionsWithoutProfile);
139 freeContainer(FuncToProfileNameMap);
144 auto It = FlattenedProfiles.
find(Fname);
145 if (It != FlattenedProfiles.end())
149 FunctionSamples *getFlattenedSamplesFor(
const Function &
F) {
151 return getFlattenedSamplesFor(FunctionId(CanonFName));
153 template <
typename T>
inline void freeContainer(
T &
C) {
157 void getFilteredAnchorList(
const AnchorMap &IRAnchors,
161 void runOnFunction(Function &
F);
162 void findIRAnchors(
const Function &
F,
AnchorMap &IRAnchors)
const;
163 void findProfileAnchors(
const FunctionSamples &FS,
167 void recordCallsiteMatchStates(
const Function &
F,
const AnchorMap &IRAnchors,
171 bool isMismatchState(
const enum MatchState &State) {
172 return State == MatchState::InitialMismatch ||
173 State == MatchState::UnchangedMismatch ||
174 State == MatchState::RemovedMatch;
177 bool isInitialState(
const enum MatchState &State) {
178 return State == MatchState::InitialMatch ||
179 State == MatchState::InitialMismatch;
182 bool isFinalState(
const enum MatchState &State) {
183 return State == MatchState::UnchangedMatch ||
184 State == MatchState::UnchangedMismatch ||
185 State == MatchState::RecoveredMismatch ||
186 State == MatchState::RemovedMatch;
189 void countCallGraphRecoveredSamples(
190 const FunctionSamples &FS,
191 std::unordered_set<FunctionId> &MatchedUnusedProfile);
194 void countMismatchedFuncSamples(
const FunctionSamples &FS,
bool IsTopLevel);
196 void countMismatchCallsites(
const FunctionSamples &FS);
199 void countMismatchedCallsiteSamples(
const FunctionSamples &FS);
200 void computeAndReportProfileStaleness();
201 void UpdateWithSalvagedProfiles();
203 LocToLocMap &getIRToProfileLocationMap(
const Function &
F) {
206 void distributeIRToProfileLocationMap();
207 void distributeIRToProfileLocationMap(FunctionSamples &FS);
210 bool MatchUnusedFunction);
211 void matchNonCallsiteLocs(
const LocToLocMap &AnchorMatchings,
214 void runStaleProfileMatching(
const Function &
F,
const AnchorMap &IRAnchors,
217 bool RunCFGMatching,
bool RunCGMatching);
219 bool functionHasProfile(
const FunctionId &IRFuncName,
220 Function *&FuncWithoutProfile);
221 bool isProfileUnused(
const FunctionId &ProfileFuncName);
222 bool functionMatchesProfileHelper(
const Function &IRFunc,
223 const FunctionId &ProfFunc);
227 bool functionMatchesProfile(
const FunctionId &IRFuncName,
228 const FunctionId &ProfileFuncName,
229 bool FindMatchedProfileOnly);
233 bool functionMatchesProfile(Function &IRFunc,
const FunctionId &ProfFunc,
234 bool FindMatchedProfileOnly);
238 void findFunctionsWithoutProfile();
239 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)