19
19
#include " swift/Demangling/Demangler.h"
20
20
#include " swift/Demangling/ManglingMacros.h"
21
21
#include " swift/SIL/ApplySite.h"
22
+ #include " swift/SIL/BasicBlockDatastructures.h"
23
+ #include " swift/SIL/BasicBlockUtils.h"
22
24
#include " swift/SIL/DebugUtils.h"
23
25
#include " swift/SIL/DynamicCasts.h"
24
26
#include " swift/SIL/SILArgument.h"
25
27
#include " swift/SIL/SILBuilder.h"
26
28
#include " swift/SIL/SILFunction.h"
27
29
#include " swift/SIL/SILInstruction.h"
28
30
#include " swift/SIL/SILModule.h"
29
- #include " swift/SIL/BasicBlockDatastructures .h"
31
+ #include " swift/SILOptimizer/Analysis/DeadEndBlocksAnalysis .h"
30
32
#include " swift/SILOptimizer/PassManager/Passes.h"
31
33
#include " swift/SILOptimizer/PassManager/Transforms.h"
34
+ #include " swift/SILOptimizer/Utils/OwnershipOptUtils.h"
32
35
#include " swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
33
36
#include " llvm/ADT/BitVector.h"
34
37
#include " llvm/Support/CommandLine.h"
@@ -118,9 +121,14 @@ namespace {
118
121
class OutlinePattern {
119
122
protected:
120
123
SILOptFunctionBuilder &FuncBuilder;
124
+ InstModCallbacks callbacks;
125
+ DeadEndBlocks *deBlocks;
121
126
122
127
public:
123
- OutlinePattern (SILOptFunctionBuilder &FuncBuilder) : FuncBuilder(FuncBuilder) {}
128
+ OutlinePattern (SILOptFunctionBuilder &FuncBuilder,
129
+ InstModCallbacks callbacks,
130
+ DeadEndBlocks *deBlocks)
131
+ : FuncBuilder(FuncBuilder), callbacks(callbacks), deBlocks(deBlocks) {}
124
132
125
133
// / Match the instruction sequence.
126
134
virtual bool matchInstSequence (SILBasicBlock::iterator I) = 0;
@@ -233,7 +241,10 @@ class BridgedProperty : public OutlinePattern {
233
241
std::pair<SILFunction *, SILBasicBlock::iterator>
234
242
outline (SILModule &M) override ;
235
243
236
- BridgedProperty (SILOptFunctionBuilder &FuncBuilder) : OutlinePattern(FuncBuilder) {
244
+ BridgedProperty (SILOptFunctionBuilder &FuncBuilder,
245
+ InstModCallbacks callbacks,
246
+ DeadEndBlocks *deBlocks)
247
+ : OutlinePattern(FuncBuilder, callbacks, deBlocks) {
237
248
clearState ();
238
249
}
239
250
@@ -352,7 +363,9 @@ BridgedProperty::outline(SILModule &M) {
352
363
auto *OutlinedEntryBB = StartBB->split (SILBasicBlock::iterator (FirstInst));
353
364
auto *OldMergeBB = switchInfo.Br ->getDestBB ();
354
365
auto *NewTailBB = OldMergeBB->split (OldMergeBB->begin ());
355
-
366
+ if (deBlocks) {
367
+ deBlocks->updateForNewBlock (NewTailBB);
368
+ }
356
369
// Call the outlined function.
357
370
{
358
371
SILBuilder Builder (StartBB);
@@ -900,8 +913,11 @@ namespace {
900
913
//
901
914
// bb3(%32 : $Optional<String>):
902
915
class BridgedReturn {
916
+ DeadEndBlocks *deBlocks;
903
917
SwitchInfo switchInfo;
904
918
public:
919
+ BridgedReturn (DeadEndBlocks *deBlocks) : deBlocks(deBlocks) {}
920
+
905
921
bool match (ApplyInst *BridgedCall) {
906
922
switchInfo = SwitchInfo ();
907
923
auto *SwitchBB = BridgedCall->getParent ();
@@ -941,7 +957,10 @@ void BridgedReturn::outline(SILFunction *Fun, ApplyInst *NewOutlinedCall) {
941
957
auto *OutlinedEntryBB = StartBB->split (SILBasicBlock::iterator (switchInfo.SwitchEnum ));
942
958
auto *OldMergeBB = switchInfo.Br ->getDestBB ();
943
959
auto *NewTailBB = OldMergeBB->split (OldMergeBB->begin ());
944
- auto Loc = switchInfo.SwitchEnum ->getLoc ();
960
+ if (deBlocks) {
961
+ deBlocks->updateForNewBlock (NewTailBB);
962
+ }
963
+ auto Loc = switchInfo.SwitchEnum ->getLoc ();
945
964
946
965
{
947
966
SILBuilder Builder (StartBB);
@@ -992,8 +1011,10 @@ class ObjCMethodCall : public OutlinePattern {
992
1011
std::pair<SILFunction *, SILBasicBlock::iterator>
993
1012
outline (SILModule &M) override ;
994
1013
995
- ObjCMethodCall (SILOptFunctionBuilder &FuncBuilder)
996
- : OutlinePattern(FuncBuilder) {}
1014
+ ObjCMethodCall (SILOptFunctionBuilder &FuncBuilder,
1015
+ InstModCallbacks callbacks,
1016
+ DeadEndBlocks *deBlocks)
1017
+ : OutlinePattern(FuncBuilder, callbacks, deBlocks), BridgedReturn(deBlocks) {}
997
1018
~ObjCMethodCall ();
998
1019
999
1020
private:
@@ -1043,7 +1064,12 @@ ObjCMethodCall::outline(SILModule &M) {
1043
1064
for (auto Arg : BridgedCall->getArguments ()) {
1044
1065
if (BridgedArgIdx < BridgedArguments.size () &&
1045
1066
BridgedArguments[BridgedArgIdx].Idx == OrigSigIdx) {
1046
- Args.push_back (BridgedArguments[BridgedArgIdx].bridgedValue ());
1067
+ auto bridgedArgValue = BridgedArguments[BridgedArgIdx].bridgedValue ();
1068
+ if (bridgedArgValue.getOwnershipKind () == OwnershipKind::Guaranteed) {
1069
+ bridgedArgValue = makeGuaranteedValueAvailable (
1070
+ bridgedArgValue, BridgedCall, *deBlocks);
1071
+ }
1072
+ Args.push_back (bridgedArgValue);
1047
1073
++BridgedArgIdx;
1048
1074
} else {
1049
1075
// Otherwise, use the original type convention.
@@ -1263,9 +1289,11 @@ class OutlinePatterns {
1263
1289
return nullptr ;
1264
1290
}
1265
1291
1266
- OutlinePatterns (SILOptFunctionBuilder &FuncBuilder)
1267
- : BridgedPropertyPattern(FuncBuilder),
1268
- ObjCMethodCallPattern (FuncBuilder) {}
1292
+ OutlinePatterns (SILOptFunctionBuilder &FuncBuilder,
1293
+ InstModCallbacks callbacks,
1294
+ DeadEndBlocks *deBlocks)
1295
+ : BridgedPropertyPattern(FuncBuilder, callbacks, deBlocks),
1296
+ ObjCMethodCallPattern (FuncBuilder, callbacks, deBlocks) {}
1269
1297
~OutlinePatterns () {}
1270
1298
1271
1299
OutlinePatterns (const OutlinePatterns&) = delete ;
@@ -1277,9 +1305,11 @@ class OutlinePatterns {
1277
1305
// / Perform outlining on the function and return any newly created outlined
1278
1306
// / functions.
1279
1307
bool tryOutline (SILOptFunctionBuilder &FuncBuilder, SILFunction *Fun,
1280
- SmallVectorImpl<SILFunction *> &FunctionsAdded) {
1308
+ SmallVectorImpl<SILFunction *> &FunctionsAdded,
1309
+ InstModCallbacks callbacks = InstModCallbacks(),
1310
+ DeadEndBlocks *deBlocks = nullptr) {
1281
1311
BasicBlockWorklist Worklist (Fun->getEntryBlock ());
1282
- OutlinePatterns patterns (FuncBuilder);
1312
+ OutlinePatterns patterns (FuncBuilder, callbacks, deBlocks );
1283
1313
bool changed = false ;
1284
1314
1285
1315
// Traverse the function.
@@ -1329,9 +1359,21 @@ class Outliner : public SILFunctionTransform {
1329
1359
Fun->dump ();
1330
1360
}
1331
1361
1362
+ DeadEndBlocksAnalysis *deBlocksAnalysis =
1363
+ PM->getAnalysis <DeadEndBlocksAnalysis>();
1364
+ DeadEndBlocks *deBlocks = deBlocksAnalysis->get (Fun);
1365
+ InstModCallbacks callbacks;
1366
+
1332
1367
SILOptFunctionBuilder FuncBuilder (*this );
1333
1368
SmallVector<SILFunction *, 16 > FunctionsAdded;
1334
- bool Changed = tryOutline (FuncBuilder, Fun, FunctionsAdded);
1369
+ bool Changed = false ;
1370
+
1371
+ if (Fun->hasOwnership ()) {
1372
+ Changed =
1373
+ tryOutline (FuncBuilder, Fun, FunctionsAdded, callbacks, deBlocks);
1374
+ } else {
1375
+ Changed = tryOutline (FuncBuilder, Fun, FunctionsAdded);
1376
+ }
1335
1377
1336
1378
if (!FunctionsAdded.empty ()) {
1337
1379
// Notify the pass manager of any new functions we outlined.
0 commit comments