Skip to content

Commit 1b52684

Browse files
committed
auto
1 parent 13d0139 commit 1b52684

File tree

4 files changed

+82
-19
lines changed

4 files changed

+82
-19
lines changed

include/swift/SILOptimizer/Analysis/RegionAnalysis.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,14 @@ class BlockPartitionState {
8888

8989
TransferringOperandSetFactory &ptrSetFactory;
9090

91+
PartitionOpEvaluatorBasic::OperandToTransferringOpMap &opToTransferringOpMap;
92+
9193
BlockPartitionState(SILBasicBlock *basicBlock,
9294
PartitionOpTranslator &translator,
9395
TransferringOperandSetFactory &ptrSetFactory,
94-
IsolationHistory::Factory &isolationHistoryFactory);
96+
IsolationHistory::Factory &isolationHistoryFactory,
97+
PartitionOpEvaluatorBasic::OperandToTransferringOpMap
98+
&opToTransferringOpMap);
9599

96100
public:
97101
bool getLiveness() const { return isLive; }
@@ -397,6 +401,8 @@ class RegionAnalysisFunctionInfo {
397401

398402
IsolationHistory::Factory isolationHistoryFactory;
399403

404+
PartitionOpEvaluatorBasic::OperandToTransferringOpMap opToTransferringOpMap;
405+
400406
// We make this optional to prevent an issue that we have seen on windows when
401407
// capturing a field in a closure that is used to initialize a different
402408
// field.
@@ -492,6 +498,12 @@ class RegionAnalysisFunctionInfo {
492498
return valueMap;
493499
}
494500

501+
PartitionOpEvaluatorBasic::OperandToTransferringOpMap &
502+
getOpToTransferringOpMap() {
503+
assert(supportedFunction && "Unsupported Function?!");
504+
return opToTransferringOpMap;
505+
}
506+
495507
bool isClosureCaptured(SILValue value, Operand *op);
496508

497509
static SILValue getUnderlyingTrackedValue(SILValue value);

include/swift/SILOptimizer/Utils/PartitionUtils.h

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -512,14 +512,21 @@ class TransferringOperand {
512512
os << "\nUser: " << *getUser();
513513
}
514514

515+
void merge(bool newIsClosureCaptured, SILIsolationInfo newIsolationRegionInfo,
516+
IsolationHistory newIsolationHistory) {
517+
value.setInt(value.getInt() | newIsClosureCaptured);
518+
isolationInfo = isolationInfo.merge(newIsolationRegionInfo);
519+
isolationHistory.pushCFGHistoryJoin(newIsolationHistory.getHead());
520+
}
521+
515522
static void Profile(llvm::FoldingSetNodeID &id, Operand *op,
516523
bool isClosureCaptured,
517524
SILIsolationInfo isolationRegionInfo,
518525
IsolationHistory isolationHistory) {
519526
id.AddPointer(op);
520527
id.AddBoolean(isClosureCaptured);
521528
isolationRegionInfo.Profile(id);
522-
id.AddPointer(isolationHistory.getHead());
529+
// We purposely do not track if isolation history changed.
523530
}
524531

525532
void Profile(llvm::FoldingSetNodeID &id) const {
@@ -737,6 +744,17 @@ class Partition {
737744
fst.canonicalize();
738745
snd.canonicalize();
739746

747+
if (fst.regionToTransferredOpMap.size() !=
748+
snd.regionToTransferredOpMap.size())
749+
return false;
750+
for (auto pair : fst.regionToTransferredOpMap) {
751+
auto iter = snd.regionToTransferredOpMap.find(pair.first);
752+
if (iter == snd.regionToTransferredOpMap.end() ||
753+
iter->second != pair.second) {
754+
return false;
755+
}
756+
}
757+
740758
return fst.elementToRegionMap == snd.elementToRegionMap;
741759
}
742760

@@ -1011,16 +1029,21 @@ struct PartitionOpEvaluator {
10111029
using Region = PartitionPrimitives::Region;
10121030
using TransferringOperandSetFactory =
10131031
Partition::TransferringOperandSetFactory;
1032+
using OperandToTransferringOpMap =
1033+
llvm::SmallDenseMap<Operand *, TransferringOperand *, 1>;
10141034

10151035
protected:
10161036
TransferringOperandSetFactory &ptrSetFactory;
1037+
OperandToTransferringOpMap &operandToTransferringOpMap;
10171038

10181039
Partition &p;
10191040

10201041
public:
10211042
PartitionOpEvaluator(Partition &p,
1022-
TransferringOperandSetFactory &ptrSetFactory)
1023-
: ptrSetFactory(ptrSetFactory), p(p) {}
1043+
TransferringOperandSetFactory &ptrSetFactory,
1044+
OperandToTransferringOpMap &operandToTransferringOpMap)
1045+
: ptrSetFactory(ptrSetFactory),
1046+
operandToTransferringOpMap(operandToTransferringOpMap), p(p) {}
10241047

10251048
/// Call shouldEmitVerboseLogging on our CRTP subclass.
10261049
bool shouldEmitVerboseLogging() const {
@@ -1194,9 +1217,21 @@ struct PartitionOpEvaluator {
11941217
}
11951218

11961219
// Mark op.getOpArgs()[0] as transferred.
1220+
auto iter = operandToTransferringOpMap.find(op.getSourceOp());
1221+
if (iter != operandToTransferringOpMap.end()) {
1222+
iter->getSecond()->merge(isClosureCapturedElt,
1223+
transferredRegionIsolation,
1224+
p.getIsolationHistory());
1225+
auto *ptrSet = ptrSetFactory.get(iter->second);
1226+
p.markTransferred(op.getOpArgs()[0], ptrSet);
1227+
return;
1228+
}
1229+
11971230
auto *ptrSet = ptrSetFactory.emplace(
11981231
op.getSourceOp(), isClosureCapturedElt, transferredRegionIsolation,
11991232
p.getIsolationHistory());
1233+
TransferringOperand *top = ptrSet->data()[0];
1234+
operandToTransferringOpMap.insert({op.getSourceOp(), top});
12001235
p.markTransferred(op.getOpArgs()[0], ptrSet);
12011236
return;
12021237
}
@@ -1305,9 +1340,10 @@ struct PartitionOpEvaluatorBaseImpl : PartitionOpEvaluator<Subclass> {
13051340
Partition::TransferringOperandSetFactory;
13061341
using Super = PartitionOpEvaluator<Subclass>;
13071342

1308-
PartitionOpEvaluatorBaseImpl(Partition &workingPartition,
1309-
TransferringOperandSetFactory &ptrSetFactory)
1310-
: Super(workingPartition, ptrSetFactory) {}
1343+
PartitionOpEvaluatorBaseImpl(
1344+
Partition &workingPartition, TransferringOperandSetFactory &ptrSetFactory,
1345+
typename Super::OperandToTransferringOpMap &operandToTransferringOpMap)
1346+
: Super(workingPartition, ptrSetFactory, operandToTransferringOpMap) {}
13111347

13121348
/// Should we emit extra verbose logging statements when evaluating
13131349
/// PartitionOps.
@@ -1373,9 +1409,12 @@ struct PartitionOpEvaluatorBaseImpl : PartitionOpEvaluator<Subclass> {
13731409
/// behavior.
13741410
struct PartitionOpEvaluatorBasic final
13751411
: PartitionOpEvaluatorBaseImpl<PartitionOpEvaluatorBasic> {
1376-
PartitionOpEvaluatorBasic(Partition &workingPartition,
1377-
TransferringOperandSetFactory &ptrSetFactory)
1378-
: PartitionOpEvaluatorBaseImpl(workingPartition, ptrSetFactory) {}
1412+
using Super = PartitionOpEvaluatorBaseImpl<PartitionOpEvaluatorBasic>;
1413+
PartitionOpEvaluatorBasic(
1414+
Partition &workingPartition, TransferringOperandSetFactory &ptrSetFactory,
1415+
Super::OperandToTransferringOpMap &operandToTransferringOpMap)
1416+
: PartitionOpEvaluatorBaseImpl(workingPartition, ptrSetFactory,
1417+
operandToTransferringOpMap) {}
13791418
};
13801419

13811420
} // namespace swift

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2954,10 +2954,13 @@ TranslationSemantics PartitionOpTranslator::visitCheckedCastAddrBranchInst(
29542954
BlockPartitionState::BlockPartitionState(
29552955
SILBasicBlock *basicBlock, PartitionOpTranslator &translator,
29562956
TransferringOperandSetFactory &ptrSetFactory,
2957-
IsolationHistory::Factory &isolationHistoryFactory)
2957+
IsolationHistory::Factory &isolationHistoryFactory,
2958+
PartitionOpEvaluatorBasic::OperandToTransferringOpMap
2959+
&operandToTransferringOpMap)
29582960
: entryPartition(isolationHistoryFactory.get()),
29592961
exitPartition(isolationHistoryFactory.get()), basicBlock(basicBlock),
2960-
ptrSetFactory(ptrSetFactory) {
2962+
ptrSetFactory(ptrSetFactory),
2963+
opToTransferringOpMap(operandToTransferringOpMap) {
29612964
translator.translateSILBasicBlock(basicBlock, blockPartitionOps);
29622965
}
29632966

@@ -2967,12 +2970,15 @@ bool BlockPartitionState::recomputeExitFromEntry(
29672970

29682971
struct ComputeEvaluator final
29692972
: PartitionOpEvaluatorBaseImpl<ComputeEvaluator> {
2973+
using Super = PartitionOpEvaluatorBaseImpl<ComputeEvaluator>;
29702974
PartitionOpTranslator &translator;
29712975

29722976
ComputeEvaluator(Partition &workingPartition,
29732977
TransferringOperandSetFactory &ptrSetFactory,
2974-
PartitionOpTranslator &translator)
2975-
: PartitionOpEvaluatorBaseImpl(workingPartition, ptrSetFactory),
2978+
PartitionOpTranslator &translator,
2979+
Super::OperandToTransferringOpMap &opToTransferringOpMap)
2980+
: PartitionOpEvaluatorBaseImpl(workingPartition, ptrSetFactory,
2981+
opToTransferringOpMap),
29762982
translator(translator) {}
29772983

29782984
SILIsolationInfo getIsolationRegionInfo(Element elt) const {
@@ -2989,7 +2995,8 @@ bool BlockPartitionState::recomputeExitFromEntry(
29892995
return translator.isClosureCaptured(value, op->getUser());
29902996
}
29912997
};
2992-
ComputeEvaluator eval(workingPartition, ptrSetFactory, translator);
2998+
ComputeEvaluator eval(workingPartition, ptrSetFactory, translator,
2999+
opToTransferringOpMap);
29933000
for (const auto &partitionOp : blockPartitionOps) {
29943001
// By calling apply without providing any error handling callbacks, errors
29953002
// will be surpressed. will be suppressed
@@ -3088,7 +3095,7 @@ RegionAnalysisFunctionInfo::RegionAnalysisFunctionInfo(
30883095
PartitionOpTranslator(fn, pofi, valueMap, isolationHistoryFactory);
30893096
blockStates.emplace(fn, [this](SILBasicBlock *block) -> BlockPartitionState {
30903097
return BlockPartitionState(block, *translator, ptrSetFactory,
3091-
isolationHistoryFactory);
3098+
isolationHistoryFactory, opToTransferringOpMap);
30923099
});
30933100
// Mark all blocks as needing to be updated.
30943101
for (auto &block : *fn) {

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,8 @@ namespace {
13321332

13331333
struct DiagnosticEvaluator final
13341334
: PartitionOpEvaluatorBaseImpl<DiagnosticEvaluator> {
1335+
using Super = PartitionOpEvaluatorBaseImpl<DiagnosticEvaluator>;
1336+
13351337
RegionAnalysisFunctionInfo *info;
13361338
SmallFrozenMultiMap<TransferringOperandRef, SILInstruction *, 8>
13371339
&transferOpToRequireInstMultiMap;
@@ -1346,9 +1348,11 @@ struct DiagnosticEvaluator final
13461348
SmallFrozenMultiMap<TransferringOperandRef, SILInstruction *, 8>
13471349
&transferOpToRequireInstMultiMap,
13481350
SmallVectorImpl<TransferredNonTransferrableInfo>
1349-
&transferredNonTransferrable)
1351+
&transferredNonTransferrable,
1352+
Super::OperandToTransferringOpMap &opToTransferringOpMap)
13501353
: PartitionOpEvaluatorBaseImpl(workingPartition,
1351-
info->getOperandSetFactory()),
1354+
info->getOperandSetFactory(),
1355+
opToTransferringOpMap),
13521356
info(info),
13531357
transferOpToRequireInstMultiMap(transferOpToRequireInstMultiMap),
13541358
transferredNonTransferrable(transferredNonTransferrable) {}
@@ -1494,7 +1498,8 @@ void TransferNonSendableImpl::runDiagnosticEvaluator() {
14941498
Partition workingPartition = blockState.getEntryPartition();
14951499
DiagnosticEvaluator eval(workingPartition, regionInfo,
14961500
transferOpToRequireInstMultiMap,
1497-
transferredNonTransferrableInfoList);
1501+
transferredNonTransferrableInfoList,
1502+
regionInfo->getOpToTransferringOpMap());
14981503

14991504
// And then evaluate all of our partition ops on the entry partition.
15001505
for (auto &partitionOp : blockState.getPartitionOps()) {

0 commit comments

Comments
 (0)