27
27
#include " swift/SIL/SILInstruction.h"
28
28
#include " swift/SIL/SILModule.h"
29
29
#include " swift/SIL/BasicBlockDatastructures.h"
30
+ #include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis.h"
30
31
#include " swift/SILOptimizer/PassManager/Passes.h"
31
32
#include " swift/SILOptimizer/PassManager/Transforms.h"
32
33
#include " swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
@@ -118,9 +119,14 @@ namespace {
118
119
class OutlinePattern {
119
120
protected:
120
121
SILOptFunctionBuilder &FuncBuilder;
122
+ InstModCallbacks callbacks;
123
+ DeadEndBlocks *deBlocks;
121
124
122
125
public:
123
- OutlinePattern (SILOptFunctionBuilder &FuncBuilder) : FuncBuilder(FuncBuilder) {}
126
+ OutlinePattern (SILOptFunctionBuilder &FuncBuilder,
127
+ InstModCallbacks callbacks,
128
+ DeadEndBlocks *deBlocks)
129
+ : FuncBuilder(FuncBuilder), callbacks(callbacks), deBlocks(deBlocks) {}
124
130
125
131
// / Match the instruction sequence.
126
132
virtual bool matchInstSequence (SILBasicBlock::iterator I) = 0;
@@ -233,7 +239,10 @@ class BridgedProperty : public OutlinePattern {
233
239
std::pair<SILFunction *, SILBasicBlock::iterator>
234
240
outline (SILModule &M) override ;
235
241
236
- BridgedProperty (SILOptFunctionBuilder &FuncBuilder) : OutlinePattern(FuncBuilder) {
242
+ BridgedProperty (SILOptFunctionBuilder &FuncBuilder,
243
+ InstModCallbacks callbacks,
244
+ DeadEndBlocks *deBlocks)
245
+ : OutlinePattern(FuncBuilder, callbacks, deBlocks) {
237
246
clearState ();
238
247
}
239
248
@@ -352,7 +361,9 @@ BridgedProperty::outline(SILModule &M) {
352
361
auto *OutlinedEntryBB = StartBB->split (SILBasicBlock::iterator (FirstInst));
353
362
auto *OldMergeBB = switchInfo.Br ->getDestBB ();
354
363
auto *NewTailBB = OldMergeBB->split (OldMergeBB->begin ());
355
-
364
+ if (deBlocks) {
365
+ deBlocks->updateForNewBlock (NewTailBB);
366
+ }
356
367
// Call the outlined function.
357
368
{
358
369
SILBuilder Builder (StartBB);
@@ -900,8 +911,11 @@ namespace {
900
911
//
901
912
// bb3(%32 : $Optional<String>):
902
913
class BridgedReturn {
914
+ DeadEndBlocks *deBlocks;
903
915
SwitchInfo switchInfo;
904
916
public:
917
+ BridgedReturn (DeadEndBlocks *deBlocks) : deBlocks(deBlocks) {}
918
+
905
919
bool match (ApplyInst *BridgedCall) {
906
920
switchInfo = SwitchInfo ();
907
921
auto *SwitchBB = BridgedCall->getParent ();
@@ -941,6 +955,9 @@ void BridgedReturn::outline(SILFunction *Fun, ApplyInst *NewOutlinedCall) {
941
955
auto *OutlinedEntryBB = StartBB->split (SILBasicBlock::iterator (switchInfo.SwitchEnum ));
942
956
auto *OldMergeBB = switchInfo.Br ->getDestBB ();
943
957
auto *NewTailBB = OldMergeBB->split (OldMergeBB->begin ());
958
+ if (deBlocks) {
959
+ deBlocks->updateForNewBlock (NewTailBB);
960
+ }
944
961
auto Loc = switchInfo.SwitchEnum ->getLoc ();
945
962
946
963
{
@@ -992,8 +1009,10 @@ class ObjCMethodCall : public OutlinePattern {
992
1009
std::pair<SILFunction *, SILBasicBlock::iterator>
993
1010
outline (SILModule &M) override ;
994
1011
995
- ObjCMethodCall (SILOptFunctionBuilder &FuncBuilder)
996
- : OutlinePattern(FuncBuilder) {}
1012
+ ObjCMethodCall (SILOptFunctionBuilder &FuncBuilder,
1013
+ InstModCallbacks callbacks,
1014
+ DeadEndBlocks *deBlocks)
1015
+ : OutlinePattern(FuncBuilder, callbacks, deBlocks), BridgedReturn(deBlocks) {}
997
1016
~ObjCMethodCall ();
998
1017
999
1018
private:
@@ -1263,9 +1282,11 @@ class OutlinePatterns {
1263
1282
return nullptr ;
1264
1283
}
1265
1284
1266
- OutlinePatterns (SILOptFunctionBuilder &FuncBuilder)
1267
- : BridgedPropertyPattern(FuncBuilder),
1268
- ObjCMethodCallPattern (FuncBuilder) {}
1285
+ OutlinePatterns (SILOptFunctionBuilder &FuncBuilder,
1286
+ InstModCallbacks callbacks,
1287
+ DeadEndBlocks *deBlocks)
1288
+ : BridgedPropertyPattern(FuncBuilder, callbacks, deBlocks),
1289
+ ObjCMethodCallPattern (FuncBuilder, callbacks, deBlocks) {}
1269
1290
~OutlinePatterns () {}
1270
1291
1271
1292
OutlinePatterns (const OutlinePatterns&) = delete ;
@@ -1277,9 +1298,11 @@ class OutlinePatterns {
1277
1298
// / Perform outlining on the function and return any newly created outlined
1278
1299
// / functions.
1279
1300
bool tryOutline (SILOptFunctionBuilder &FuncBuilder, SILFunction *Fun,
1280
- SmallVectorImpl<SILFunction *> &FunctionsAdded) {
1301
+ SmallVectorImpl<SILFunction *> &FunctionsAdded,
1302
+ InstModCallbacks callbacks,
1303
+ DeadEndBlocks *deBlocks) {
1281
1304
BasicBlockWorklist Worklist (Fun->getEntryBlock ());
1282
- OutlinePatterns patterns (FuncBuilder);
1305
+ OutlinePatterns patterns (FuncBuilder, callbacks, deBlocks );
1283
1306
bool changed = false ;
1284
1307
1285
1308
// Traverse the function.
@@ -1323,15 +1346,27 @@ class Outliner : public SILFunctionTransform {
1323
1346
if (!Fun->optimizeForSize ())
1324
1347
return ;
1325
1348
1349
+
1326
1350
// Dump function if requested.
1327
1351
if (DumpFuncsBeforeOutliner.size () &&
1328
1352
Fun->getName ().contains (DumpFuncsBeforeOutliner)) {
1329
1353
Fun->dump ();
1330
1354
}
1331
1355
1356
+ DeadEndBlocksAnalysis *deBlocksAnalysis =
1357
+ PM->getAnalysis <DeadEndBlocksAnalysis>();
1358
+ DeadEndBlocks *deBlocks = deBlocksAnalysis->get (Fun);
1359
+ InstModCallbacks callbacks;
1360
+
1332
1361
SILOptFunctionBuilder FuncBuilder (*this );
1333
1362
SmallVector<SILFunction *, 16 > FunctionsAdded;
1334
- bool Changed = tryOutline (FuncBuilder, Fun, FunctionsAdded);
1363
+ bool Changed = false ;
1364
+
1365
+ if (Fun->hasOwnership ()) {
1366
+ Changed = tryOutline (FuncBuilder, Fun, FunctionsAdded, callbacks, deBlocks);
1367
+ } else {
1368
+ Changed = tryOutline (FuncBuilder, Fun, FunctionsAdded);
1369
+ }
1335
1370
1336
1371
if (!FunctionsAdded.empty ()) {
1337
1372
// Notify the pass manager of any new functions we outlined.
0 commit comments