Skip to content

Commit 46bdf13

Browse files
committed
Fix store_borrow generation in GenericCloner
1 parent bf7cbb5 commit 46bdf13

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

include/swift/SILOptimizer/Utils/GenericCloner.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class GenericCloner
4141
RemappedScopeCache;
4242

4343
llvm::SmallVector<AllocStackInst *, 8> AllocStacks;
44+
llvm::SmallVector<StoreBorrowInst *, 8> StoreBorrowsToCleanup;
45+
llvm::SmallVector<TermInst *, 8> FunctionExits;
4446
AllocStackInst *ReturnValueAddr = nullptr;
4547

4648
public:
@@ -92,6 +94,11 @@ class GenericCloner
9294
if (Callback)
9395
Callback(Orig, Cloned);
9496

97+
if (auto *termInst = dyn_cast<TermInst>(Cloned)) {
98+
if (termInst->isFunctionExiting()) {
99+
FunctionExits.push_back(termInst);
100+
}
101+
}
95102
SILClonerWithScopes<GenericCloner>::postProcess(Orig, Cloned);
96103
}
97104

lib/SILOptimizer/Utils/GenericCloner.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
#include "swift/SILOptimizer/Utils/GenericCloner.h"
1414

1515
#include "swift/AST/Type.h"
16+
#include "swift/SIL/OwnershipUtils.h"
1617
#include "swift/SIL/SILBasicBlock.h"
1718
#include "swift/SIL/SILFunction.h"
1819
#include "swift/SIL/SILInstruction.h"
1920
#include "swift/SIL/SILModule.h"
2021
#include "swift/SIL/SILValue.h"
22+
#include "swift/SIL/ScopedAddressUtils.h"
2123
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
2224
#include "swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
2325
#include "llvm/ADT/ArrayRef.h"
@@ -61,7 +63,6 @@ void GenericCloner::populateCloned() {
6163
assert(!ReturnValueAddr && "Stale cloner state.");
6264

6365
SILFunction *Cloned = getCloned();
64-
6566
// Create arguments for the entry block.
6667
SILBasicBlock *OrigEntryBB = &*Original.begin();
6768
SILBasicBlock *ClonedEntryBB = Cloned->createBasicBlock();
@@ -142,14 +143,19 @@ void GenericCloner::populateCloned() {
142143

143144
// Store the new direct parameter to an alloc_stack.
144145
createAllocStack();
145-
if (!NewArg->getArgumentConvention().isGuaranteedConvention()) {
146+
SILValue addr;
147+
if (NewArg->getArgumentConvention().isGuaranteedConvention() &&
148+
NewArg->getFunction()->hasOwnership()) {
149+
auto *sbi = getBuilder().createStoreBorrow(Loc, NewArg, ASI);
150+
StoreBorrowsToCleanup.push_back(sbi);
151+
addr = sbi;
152+
} else {
146153
getBuilder().emitStoreValueOperation(Loc, NewArg, ASI,
147154
StoreOwnershipQualifier::Init);
148-
} else {
149-
getBuilder().emitStoreBorrowOperation(Loc, NewArg, ASI);
155+
addr = ASI;
150156
}
151157

152-
entryArgs.push_back(ASI);
158+
entryArgs.push_back(addr);
153159
return true;
154160
}
155161
}
@@ -225,4 +231,25 @@ void GenericCloner::postFixUp(SILFunction *f) {
225231
getBuilder().setInsertionPoint(applyBlock);
226232
getBuilder().createUnreachable(apply->getLoc());
227233
}
234+
235+
SmallVector<SILBasicBlock *, 4> discoveredBlocks;
236+
for (auto *sbi : StoreBorrowsToCleanup) {
237+
ScopedAddressValue scopedAddress(sbi);
238+
if (scopedAddress->getUses().empty()) {
239+
scopedAddress.createScopeEnd(sbi->getNextInstruction()->getIterator(),
240+
RegularLocation::getAutoGeneratedLocation());
241+
continue;
242+
}
243+
discoveredBlocks.clear();
244+
PrunedLiveness storeBorrowLiveness(&discoveredBlocks);
245+
bool success = scopedAddress.computeLiveness(storeBorrowLiveness);
246+
if (success) {
247+
scopedAddress.endScopeAtLivenessBoundary(&storeBorrowLiveness);
248+
continue;
249+
}
250+
for (auto *exit : FunctionExits) {
251+
scopedAddress.createScopeEnd(exit->getIterator(),
252+
RegularLocation::getAutoGeneratedLocation());
253+
}
254+
}
228255
}

test/SILOptimizer/specialize_default_witness_resilience_ossa.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public struct ConformingNonTrivialStruct : ResilientProtocol {
3838
// CHECK-LABEL: sil shared [ossa] @$s8defaultA4main26ConformingNonTrivialStructV_TB5
3939
// CHECK: bb0(%0 : @guaranteed $ConformingNonTrivialStruct):
4040
// CHECK-NEXT: [[TMP:%.*]] = alloc_stack $ConformingNonTrivialStruct
41-
// CHECK-NEXT: store_borrow %0 to [[TMP]] : $*ConformingNonTrivialStruct
41+
// CHECK-NEXT: [[SB:%.*]] = store_borrow %0 to [[TMP]] : $*ConformingNonTrivialStruct
4242
// CHECK: [[FN:%.*]] = function_ref @$s8defaultB4main26ConformingNonTrivialStructV_TB5
43-
// CHECK-NEXT: [[LOAD:%.*]] = load_borrow [[TMP]] : $*ConformingNonTrivialStruct
43+
// CHECK-NEXT: [[LOAD:%.*]] = load_borrow [[SB]] : $*ConformingNonTrivialStruct
4444
// CHECK-NEXT: [[RESULT:%.*]] = apply [[FN]]([[LOAD]])
4545
// CHECK: dealloc_stack [[TMP]] : $*ConformingNonTrivialStruct
4646
// CHECK } // end sil function 's8defaultA4main16ConformingNonTrivialStructV_TB5'

0 commit comments

Comments
 (0)