1717#include " swift/SIL/MemAccessUtils.h"
1818#include " swift/SIL/OptimizationRemark.h"
1919#include " swift/SILOptimizer/Analysis/BasicCalleeAnalysis.h"
20+ #include " swift/SILOptimizer/Analysis/IsSelfRecursiveAnalysis.h"
2021#include " swift/SILOptimizer/PassManager/Passes.h"
2122#include " swift/SILOptimizer/PassManager/Transforms.h"
2223#include " swift/SILOptimizer/Utils/BasicBlockOptUtils.h"
@@ -107,6 +108,7 @@ class SILPerformanceInliner {
107108 DominanceAnalysis *DA;
108109 SILLoopAnalysis *LA;
109110 BasicCalleeAnalysis *BCA;
111+ IsSelfRecursiveAnalysis *SRA;
110112
111113 // For keys of SILFunction and SILLoop.
112114 llvm::DenseMap<SILFunction *, ShortestPathAnalysis *> SPAs;
@@ -238,14 +240,14 @@ class SILPerformanceInliner {
238240
239241public:
240242 SILPerformanceInliner (StringRef PassName, SILOptFunctionBuilder &FuncBuilder,
241- InlineSelection WhatToInline,
242- SILPassManager *pm, DominanceAnalysis *DA,
243- PostDominanceAnalysis *PDA,
243+ InlineSelection WhatToInline, SILPassManager *pm,
244+ DominanceAnalysis *DA, PostDominanceAnalysis *PDA,
244245 SILLoopAnalysis *LA, BasicCalleeAnalysis *BCA,
245- OptimizationMode OptMode, OptRemark::Emitter &ORE)
246+ IsSelfRecursiveAnalysis *SRA, OptimizationMode OptMode,
247+ OptRemark::Emitter &ORE)
246248 : PassName(PassName), FuncBuilder(FuncBuilder),
247- WhatToInline (WhatToInline), pm(pm), DA(DA), LA(LA), BCA(BCA), CBI(DA, PDA), ORE(ORE ),
248- OptMode(OptMode) {}
249+ WhatToInline (WhatToInline), pm(pm), DA(DA), LA(LA), BCA(BCA), SRA(SRA ),
250+ CBI(DA, PDA), ORE(ORE), OptMode(OptMode) {}
249251
250252 bool inlineCallsIntoFunction (SILFunction *F);
251253};
@@ -1087,7 +1089,7 @@ void SILPerformanceInliner::collectAppliesToInline(
10871089 // At this occasion we record additional weight increases.
10881090 addWeightCorrection (FAS, WeightCorrections);
10891091
1090- if (SILFunction *Callee = getEligibleFunction (FAS, WhatToInline)) {
1092+ if (SILFunction *Callee = getEligibleFunction (FAS, WhatToInline, SRA )) {
10911093 // Compute the shortest-path analysis for the callee.
10921094 SILLoopInfo *CalleeLI = LA->get (Callee);
10931095 ShortestPathAnalysis *CalleeSPA = getSPA (Callee, CalleeLI);
@@ -1138,7 +1140,7 @@ void SILPerformanceInliner::collectAppliesToInline(
11381140
11391141 FullApplySite AI = FullApplySite (&*I);
11401142
1141- auto *Callee = getEligibleFunction (AI, WhatToInline);
1143+ auto *Callee = getEligibleFunction (AI, WhatToInline, SRA );
11421144 if (Callee) {
11431145 // Check if we have an always_inline or transparent function. If we do,
11441146 // just add it to our final Applies list and continue.
@@ -1328,7 +1330,7 @@ void SILPerformanceInliner::visitColdBlocks(
13281330 if (!AI)
13291331 continue ;
13301332
1331- auto *Callee = getEligibleFunction (AI, WhatToInline);
1333+ auto *Callee = getEligibleFunction (AI, WhatToInline, SRA );
13321334 if (Callee && decideInColdBlock (AI, Callee, numCallerBlocks)) {
13331335 AppliesToInline.push_back (AI);
13341336 }
@@ -1358,6 +1360,7 @@ class SILPerformanceInlinerPass : public SILFunctionTransform {
13581360 PostDominanceAnalysis *PDA = PM->getAnalysis <PostDominanceAnalysis>();
13591361 SILLoopAnalysis *LA = PM->getAnalysis <SILLoopAnalysis>();
13601362 BasicCalleeAnalysis *BCA = PM->getAnalysis <BasicCalleeAnalysis>();
1363+ IsSelfRecursiveAnalysis *SRA = PM->getAnalysis <IsSelfRecursiveAnalysis>();
13611364 OptRemark::Emitter ORE (DEBUG_TYPE, *getFunction ());
13621365
13631366 if (getOptions ().InlineThreshold == 0 ) {
@@ -1369,7 +1372,8 @@ class SILPerformanceInlinerPass : public SILFunctionTransform {
13691372 SILOptFunctionBuilder FuncBuilder (*this );
13701373
13711374 SILPerformanceInliner Inliner (getID (), FuncBuilder, WhatToInline,
1372- getPassManager (), DA, PDA, LA, BCA, OptMode, ORE);
1375+ getPassManager (), DA, PDA, LA, BCA, SRA,
1376+ OptMode, ORE);
13731377
13741378 assert (getFunction ()->isDefinition () &&
13751379 " Expected only functions with bodies!" );
0 commit comments