@@ -1125,25 +1125,42 @@ struct AnalysisGetter {
1125
1125
template <typename , typename = void > static constexpr bool HasLegacyWrapper = false ;
1126
1126
1127
1127
template <typename Analysis>
1128
- typename Analysis::Result *getAnalysis (const Function &F) {
1129
- if (FAM)
1128
+ typename Analysis::Result *getAnalysis (const Function &F,
1129
+ bool RequestCachedOnly = false ) {
1130
+ if (!LegacyPass && !FAM)
1131
+ return nullptr ;
1132
+ if (FAM) {
1133
+ if (CachedOnly || RequestCachedOnly)
1134
+ return FAM->getCachedResult <Analysis>(const_cast <Function &>(F));
1130
1135
return &FAM->getResult <Analysis>(const_cast <Function &>(F));
1131
- if constexpr (HasLegacyWrapper<Analysis>)
1132
- if (LegacyPass)
1136
+ }
1137
+ if constexpr (HasLegacyWrapper<Analysis>) {
1138
+ if (!CachedOnly && !RequestCachedOnly)
1133
1139
return &LegacyPass
1134
1140
->getAnalysis <typename Analysis::LegacyWrapper>(
1135
1141
const_cast <Function &>(F))
1136
1142
.getResult ();
1143
+ if (auto *P =
1144
+ LegacyPass
1145
+ ->getAnalysisIfAvailable <typename Analysis::LegacyWrapper>())
1146
+ return &P->getResult ();
1147
+ }
1137
1148
return nullptr ;
1138
1149
}
1139
1150
1140
- AnalysisGetter (FunctionAnalysisManager &FAM) : FAM(&FAM) {}
1141
- AnalysisGetter (Pass *P) : LegacyPass(P) {}
1151
+ AnalysisGetter (FunctionAnalysisManager &FAM, bool CachedOnly = false )
1152
+ : FAM(&FAM), CachedOnly(CachedOnly) {}
1153
+ AnalysisGetter (Pass *P, bool CachedOnly = false )
1154
+ : LegacyPass(P), CachedOnly(CachedOnly) {}
1142
1155
AnalysisGetter () = default ;
1143
1156
1144
1157
private:
1145
1158
FunctionAnalysisManager *FAM = nullptr ;
1146
1159
Pass *LegacyPass = nullptr ;
1160
+
1161
+ // / If \p CachedOnly is true, no pass is created, just existing results are
1162
+ // / used. Also available per request.
1163
+ bool CachedOnly = false ;
1147
1164
};
1148
1165
1149
1166
template <typename Analysis>
@@ -1288,9 +1305,6 @@ struct InformationCache {
1288
1305
return AG.getAnalysis <TargetLibraryAnalysis>(F);
1289
1306
}
1290
1307
1291
- // / Return AliasAnalysis Result for function \p F.
1292
- AAResults *getAAResultsForFunction (const Function &F);
1293
-
1294
1308
// / Return true if \p Arg is involved in a must-tail call, thus the argument
1295
1309
// / of the caller or callee.
1296
1310
bool isInvolvedInMustTailCall (const Argument &Arg) {
@@ -1304,8 +1318,9 @@ struct InformationCache {
1304
1318
1305
1319
// / Return the analysis result from a pass \p AP for function \p F.
1306
1320
template <typename AP>
1307
- typename AP::Result *getAnalysisResultForFunction (const Function &F) {
1308
- return AG.getAnalysis <AP>(F);
1321
+ typename AP::Result *getAnalysisResultForFunction (const Function &F,
1322
+ bool CachedOnly = false ) {
1323
+ return AG.getAnalysis <AP>(F, CachedOnly);
1309
1324
}
1310
1325
1311
1326
// / Return datalayout used in the module.
0 commit comments