Skip to content

Commit aadb2ea

Browse files
authored
Merge pull request #6230 from gottesmm/store_borrow_begin_borrow
[semantic-arc] Add StoreBorrowInst and BeginBorrowInst.
2 parents 90b329b + 66cff7e commit aadb2ea

File tree

18 files changed

+198
-8
lines changed

18 files changed

+198
-8
lines changed

include/swift/SIL/SILBuilder.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,11 @@ class SILBuilder {
488488
LoadBorrowInst(getSILDebugLocation(Loc), LV));
489489
}
490490

491+
BeginBorrowInst *createBeginBorrow(SILLocation Loc, SILValue LV) {
492+
return insert(new (F.getModule())
493+
BeginBorrowInst(getSILDebugLocation(Loc), LV));
494+
}
495+
491496
StoreInst *createStore(SILLocation Loc, SILValue Src, SILValue DestAddr,
492497
StoreOwnershipQualifier Qualifier) {
493498
assert((Qualifier != StoreOwnershipQualifier::Unqualified) ||
@@ -520,6 +525,12 @@ class SILBuilder {
520525
AssignInst(getSILDebugLocation(Loc), Src, DestAddr));
521526
}
522527

528+
StoreBorrowInst *createStoreBorrow(SILLocation Loc, SILValue Src,
529+
SILValue DestAddr) {
530+
return insert(new (F.getModule())
531+
StoreBorrowInst(getSILDebugLocation(Loc), Src, DestAddr));
532+
}
533+
523534
MarkUninitializedInst *
524535
createMarkUninitialized(SILLocation Loc, SILValue src,
525536
MarkUninitializedInst::Kind k) {

include/swift/SIL/SILCloner.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,14 @@ void SILCloner<ImplClass>::visitLoadBorrowInst(LoadBorrowInst *Inst) {
673673
getOpValue(Inst->getOperand())));
674674
}
675675

676+
template <typename ImplClass>
677+
void SILCloner<ImplClass>::visitBeginBorrowInst(BeginBorrowInst *Inst) {
678+
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
679+
doPostProcess(Inst,
680+
getBuilder().createBeginBorrow(getOpLocation(Inst->getLoc()),
681+
getOpValue(Inst->getOperand())));
682+
}
683+
676684
template <typename ImplClass>
677685
void SILCloner<ImplClass>::visitStoreInst(StoreInst *Inst) {
678686
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
@@ -682,6 +690,15 @@ void SILCloner<ImplClass>::visitStoreInst(StoreInst *Inst) {
682690
Inst->getOwnershipQualifier()));
683691
}
684692

693+
template <typename ImplClass>
694+
void SILCloner<ImplClass>::visitStoreBorrowInst(StoreBorrowInst *Inst) {
695+
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
696+
doPostProcess(Inst,
697+
getBuilder().createStoreBorrow(getOpLocation(Inst->getLoc()),
698+
getOpValue(Inst->getSrc()),
699+
getOpValue(Inst->getDest())));
700+
}
701+
685702
template <typename ImplClass>
686703
void SILCloner<ImplClass>::visitEndBorrowInst(EndBorrowInst *Inst) {
687704
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));

include/swift/SIL/SILInstruction.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,6 +1747,46 @@ class LoadBorrowInst : public UnaryInstructionBase<ValueKind::LoadBorrowInst> {
17471747
LValue->getType().getObjectType()) {}
17481748
};
17491749

1750+
/// Represents the begin scope of a borrowed value. Must be paired with an
1751+
/// end_borrow instruction in its use-def list.
1752+
class BeginBorrowInst
1753+
: public UnaryInstructionBase<ValueKind::BeginBorrowInst> {
1754+
friend class SILBuilder;
1755+
1756+
BeginBorrowInst(SILDebugLocation DebugLoc, SILValue LValue)
1757+
: UnaryInstructionBase(DebugLoc, LValue,
1758+
LValue->getType().getObjectType()) {}
1759+
};
1760+
1761+
/// Represents a store of a borrowed value into an address. Returns the borrowed
1762+
/// address. Must be paired with a end_borrow in its use-def list.
1763+
class StoreBorrowInst : public SILInstruction {
1764+
friend class SILBuilder;
1765+
1766+
public:
1767+
enum {
1768+
/// The source of the value being borrowed.
1769+
Src,
1770+
/// The destination of the borrowed value.
1771+
Dest
1772+
};
1773+
1774+
private:
1775+
FixedOperandList<2> Operands;
1776+
StoreBorrowInst(SILDebugLocation DebugLoc, SILValue Src, SILValue Dest);
1777+
1778+
public:
1779+
SILValue getSrc() const { return Operands[Src].get(); }
1780+
SILValue getDest() const { return Operands[Dest].get(); }
1781+
1782+
ArrayRef<Operand> getAllOperands() const { return Operands.asArray(); }
1783+
MutableArrayRef<Operand> getAllOperands() { return Operands.asArray(); }
1784+
1785+
static bool classof(const ValueBase *V) {
1786+
return V->getKind() == ValueKind::StoreBorrowInst;
1787+
}
1788+
};
1789+
17501790
/// Represents the end of a borrow scope for a value or address from another
17511791
/// value or address.
17521792
///

include/swift/SIL/SILNodes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,12 @@ ABSTRACT_VALUE(SILInstruction, ValueBase)
9595
// Accessing memory
9696
INST(LoadInst, SILInstruction, load, MayRead, DoesNotRelease)
9797
INST(LoadBorrowInst, SILInstruction, load_borrow, MayRead, DoesNotRelease)
98+
INST(BeginBorrowInst, SILInstruction, begin_borrow, MayHaveSideEffects, DoesNotRelease)
9899
INST(EndBorrowInst, SILInstruction, end_borrow, MayHaveSideEffects, DoesNotRelease)
99100
INST(LoadUnownedInst, SILInstruction, load_unowned, MayRead, DoesNotRelease)
100101
INST(LoadWeakInst, SILInstruction, load_weak, MayRead, DoesNotRelease)
101102
INST(StoreInst, SILInstruction, store, MayWrite, DoesNotRelease)
103+
INST(StoreBorrowInst, SILInstruction, store_borrow, MayWrite, DoesNotRelease)
102104
INST(AssignInst, SILInstruction, assign, MayWrite, DoesNotRelease)
103105
INST(MarkUninitializedInst, SILInstruction, mark_uninitialized, None, DoesNotRelease)
104106
INST(MarkUninitializedBehaviorInst, SILInstruction, mark_uninitialized_behavior, None, DoesNotRelease)

include/swift/Serialization/ModuleFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const uint16_t VERSION_MAJOR = 0;
5454
/// in source control, you should also update the comment to briefly
5555
/// describe what change you made. The content of this comment isn't important;
5656
/// it just ensures a conflict if two people change the module format.
57-
const uint16_t VERSION_MINOR = 297; // Last change: typealias underlying interface type
57+
const uint16_t VERSION_MINOR = 298; // Last change: Added {store,begin}_borrow
5858

5959
using DeclID = PointerEmbeddedInt<unsigned, 31>;
6060
using DeclIDField = BCFixed<31>;

lib/IRGen/IRGenSIL.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,9 +858,15 @@ class IRGenSILFunction :
858858
void visitInitBlockStorageHeaderInst(InitBlockStorageHeaderInst *i);
859859

860860
void visitFixLifetimeInst(FixLifetimeInst *i);
861+
void visitBeginBorrowInst(BeginBorrowInst *i) {
862+
llvm_unreachable("unimplemented");
863+
}
861864
void visitEndBorrowInst(EndBorrowInst *i) {
862865
llvm_unreachable("unimplemented");
863866
}
867+
void visitStoreBorrowInst(StoreBorrowInst *i) {
868+
llvm_unreachable("unimplemented");
869+
}
864870
void visitMarkDependenceInst(MarkDependenceInst *i);
865871
void visitCopyBlockInst(CopyBlockInst *i);
866872
void visitStrongPinInst(StrongPinInst *i);

lib/Parse/ParseSIL.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,6 +1957,16 @@ bool SILParser::parseSILInstruction(SILBasicBlock *BB, SILBuilder &B) {
19571957
break;
19581958
}
19591959

1960+
case ValueKind::BeginBorrowInst: {
1961+
SourceLoc AddrLoc;
1962+
1963+
if (parseTypedValueRef(Val, AddrLoc, B) || parseSILDebugLocation(InstLoc, B))
1964+
return true;
1965+
1966+
ResultVal = B.createBeginBorrow(InstLoc, Val);
1967+
break;
1968+
}
1969+
19601970
case ValueKind::LoadUnownedInst:
19611971
case ValueKind::LoadWeakInst: {
19621972
bool isTake = false;
@@ -2438,6 +2448,7 @@ bool SILParser::parseSILInstruction(SILBasicBlock *BB, SILBuilder &B) {
24382448
break;
24392449
}
24402450

2451+
case ValueKind::StoreBorrowInst:
24412452
case ValueKind::AssignInst:
24422453
case ValueKind::StoreUnownedInst:
24432454
case ValueKind::StoreWeakInst: {
@@ -2468,6 +2479,13 @@ bool SILParser::parseSILInstruction(SILBasicBlock *BB, SILBuilder &B) {
24682479
return true;
24692480
}
24702481

2482+
if (Opcode == ValueKind::StoreBorrowInst) {
2483+
SILType valueTy = addrVal->getType().getObjectType();
2484+
ResultVal = B.createStoreBorrow(
2485+
InstLoc, getLocalValue(from, valueTy, InstLoc, B), addrVal);
2486+
break;
2487+
}
2488+
24712489
if (Opcode == ValueKind::StoreUnownedInst) {
24722490
auto refType = addrVal->getType().getAs<UnownedStorageType>();
24732491
if (!refType) {

lib/SIL/SILInstruction.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,12 @@ namespace {
286286
bool visitLoadBorrowInst(const LoadBorrowInst *RHS) { return true; }
287287

288288
bool visitEndBorrowInst(const EndBorrowInst *RHS) { return true; }
289+
bool visitBeginBorrowInst(const BeginBorrowInst *BBI) { return true; }
290+
291+
bool visitStoreBorrowInst(const StoreBorrowInst *RHS) {
292+
auto *X = cast<StoreBorrowInst>(LHS);
293+
return X->getSrc() == RHS->getSrc() && X->getDest() == RHS->getDest();
294+
}
289295

290296
bool visitStoreInst(const StoreInst *RHS) {
291297
auto *X = cast<StoreInst>(LHS);

lib/SIL/SILInstructions.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,11 @@ StoreInst::StoreInst(
662662
: SILInstruction(ValueKind::StoreInst, Loc), Operands(this, Src, Dest),
663663
OwnershipQualifier(Qualifier) {}
664664

665+
StoreBorrowInst::StoreBorrowInst(SILDebugLocation DebugLoc, SILValue Src,
666+
SILValue Dest)
667+
: SILInstruction(ValueKind::StoreBorrowInst, DebugLoc, Dest->getType()),
668+
Operands(this, Src, Dest) {}
669+
665670
EndBorrowInst::EndBorrowInst(SILDebugLocation DebugLoc, SILValue Src,
666671
SILValue Dest)
667672
: SILInstruction(ValueKind::EndBorrowInst, DebugLoc),

lib/SIL/SILPrinter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,10 @@ class SILPrinter : public SILVisitor<SILPrinter> {
10381038
*this << getIDAndType(LBI->getOperand());
10391039
}
10401040

1041+
void visitBeginBorrowInst(BeginBorrowInst *LBI) {
1042+
*this << getIDAndType(LBI->getOperand());
1043+
}
1044+
10411045
void printStoreOwnershipQualifier(StoreOwnershipQualifier Qualifier) {
10421046
switch (Qualifier) {
10431047
case StoreOwnershipQualifier::Unqualified:
@@ -1060,6 +1064,11 @@ class SILPrinter : public SILVisitor<SILPrinter> {
10601064
*this << getIDAndType(SI->getDest());
10611065
}
10621066

1067+
void visitStoreBorrowInst(StoreBorrowInst *SI) {
1068+
*this << getID(SI->getSrc()) << " to ";
1069+
*this << getIDAndType(SI->getDest());
1070+
}
1071+
10631072
void visitEndBorrowInst(EndBorrowInst *EBI) {
10641073
*this << getID(EBI->getDest()) << " from " << getID(EBI->getSrc()) << " : "
10651074
<< EBI->getDest()->getType() << ", " << EBI->getSrc()->getType();

lib/SILOptimizer/Transforms/OwnershipModelEliminator.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,15 @@ struct OwnershipModelEliminatorVisitor
5050
bool visitValueBase(ValueBase *V) { return false; }
5151
bool visitLoadInst(LoadInst *LI);
5252
bool visitStoreInst(StoreInst *SI);
53+
bool visitStoreBorrowInst(StoreBorrowInst *SI);
5354
bool visitCopyValueInst(CopyValueInst *CVI);
5455
bool visitDestroyValueInst(DestroyValueInst *DVI);
5556
bool visitLoadBorrowInst(LoadBorrowInst *LBI);
57+
bool visitBeginBorrowInst(BeginBorrowInst *BBI) {
58+
BBI->replaceAllUsesWith(BBI->getOperand());
59+
BBI->eraseFromParent();
60+
return true;
61+
}
5662
bool visitEndBorrowInst(EndBorrowInst *EBI) {
5763
EBI->eraseFromParent();
5864
return true;
@@ -95,6 +101,16 @@ bool OwnershipModelEliminatorVisitor::visitStoreInst(StoreInst *SI) {
95101
return true;
96102
}
97103

104+
bool OwnershipModelEliminatorVisitor::visitStoreBorrowInst(
105+
StoreBorrowInst *SI) {
106+
B.emitStoreValueOperation(SI->getLoc(), SI->getSrc(), SI->getDest(),
107+
StoreOwnershipQualifier::Init);
108+
109+
// Then remove the qualified store.
110+
SI->eraseFromParent();
111+
return true;
112+
}
113+
98114
bool
99115
OwnershipModelEliminatorVisitor::visitLoadBorrowInst(LoadBorrowInst *LBI) {
100116
// Break down the load borrow into an unqualified load.

lib/SILOptimizer/Utils/SILInliner.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ InlineCost swift::instructionInlineCost(SILInstruction &I) {
226226
case ValueKind::StringLiteralInst:
227227
case ValueKind::FixLifetimeInst:
228228
case ValueKind::EndBorrowInst:
229+
case ValueKind::BeginBorrowInst:
229230
case ValueKind::MarkDependenceInst:
230231
case ValueKind::FunctionRefInst:
231232
case ValueKind::AllocGlobalInst:
@@ -366,6 +367,7 @@ InlineCost swift::instructionInlineCost(SILInstruction &I) {
366367
case ValueKind::RefToUnmanagedInst:
367368
case ValueKind::RefToUnownedInst:
368369
case ValueKind::StoreInst:
370+
case ValueKind::StoreBorrowInst:
369371
case ValueKind::StoreUnownedInst:
370372
case ValueKind::StoreWeakInst:
371373
case ValueKind::StrongPinInst:

lib/Serialization/DeserializeSIL.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,7 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn, SILBasicBlock *BB,
13121312
UNARY_INSTRUCTION(FixLifetime)
13131313
UNARY_INSTRUCTION(CopyBlock)
13141314
UNARY_INSTRUCTION(LoadBorrow)
1315+
UNARY_INSTRUCTION(BeginBorrow)
13151316
REFCOUNTING_INSTRUCTION(StrongPin)
13161317
REFCOUNTING_INSTRUCTION(StrongUnpin)
13171318
REFCOUNTING_INSTRUCTION(StrongRetain)
@@ -1367,6 +1368,14 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn, SILBasicBlock *BB,
13671368
getLocalValue(ValID2, addrType), Qualifier);
13681369
break;
13691370
}
1371+
case ValueKind::StoreBorrowInst: {
1372+
auto Ty = MF->getType(TyID);
1373+
SILType addrType = getSILType(Ty, (SILValueCategory)TyCategory);
1374+
SILType ValType = addrType.getObjectType();
1375+
ResultVal = Builder.createStoreBorrow(Loc, getLocalValue(ValID, ValType),
1376+
getLocalValue(ValID2, addrType));
1377+
break;
1378+
}
13701379
case ValueKind::EndBorrowInst: {
13711380
SILValue BorrowSource, BorrowDest;
13721381
BorrowSource = getLocalValue(

lib/Serialization/SerializeSIL.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,7 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
10151015
case ValueKind::IsNonnullInst:
10161016
case ValueKind::LoadInst:
10171017
case ValueKind::LoadBorrowInst:
1018+
case ValueKind::BeginBorrowInst:
10181019
case ValueKind::LoadUnownedInst:
10191020
case ValueKind::LoadWeakInst:
10201021
case ValueKind::MarkUninitializedInst:
@@ -1292,6 +1293,7 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
12921293
case ValueKind::AssignInst:
12931294
case ValueKind::CopyAddrInst:
12941295
case ValueKind::StoreInst:
1296+
case ValueKind::StoreBorrowInst:
12951297
case ValueKind::StoreUnownedInst:
12961298
case ValueKind::StoreWeakInst: {
12971299
SILValue operand, value;
@@ -1316,8 +1318,12 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
13161318
Attr = (CAI->isInitializationOfDest() << 1) | CAI->isTakeOfSrc();
13171319
operand = cast<CopyAddrInst>(&SI)->getDest();
13181320
value = cast<CopyAddrInst>(&SI)->getSrc();
1319-
} else
1321+
} else if (auto *SBI = dyn_cast<StoreBorrowInst>(&SI)) {
1322+
operand = SBI->getDest();
1323+
value = SBI->getSrc();
1324+
} else {
13201325
llvm_unreachable("switch out of sync");
1326+
}
13211327

13221328
unsigned abbrCode = SILAbbrCodes[SILOneValueOneOperandLayout::Code];
13231329
SILOneValueOneOperandLayout::emitRecord(Out, ScratchRecord, abbrCode,

test/SIL/Parser/borrow.sil

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,27 @@ import Builtin
77
// We do not verify here, but just make sure that all of the combinations parse and print correctly.
88
// CHECK-LABEL: sil @borrow_test : $@convention(thin) (@in Builtin.NativeObject, Builtin.NativeObject) -> () {
99
// CHECK: bb0([[ARG1:%[0-9]+]] : $*Builtin.NativeObject, [[ARG2:%[0-9]+]] : $Builtin.NativeObject):
10+
// CHECK: begin_borrow [[ARG2]]
11+
// CHECK: [[MEM:%.*]] = alloc_stack $Builtin.NativeObject
12+
// CHECK: store_borrow [[ARG2]] to [[MEM]] : $*Builtin.NativeObject
1013
// CHECK: end_borrow [[ARG1]] from [[ARG2]] : $*Builtin.NativeObject, $Builtin.NativeObject
1114
// CHECK: end_borrow [[ARG2]] from [[ARG1]] : $Builtin.NativeObject, $*Builtin.NativeObject
1215
// CHECK: end_borrow [[ARG1]] from [[ARG1]] : $*Builtin.NativeObject, $*Builtin.NativeObject
1316
// CHECK: end_borrow [[ARG2]] from [[ARG2]] : $Builtin.NativeObject, $Builtin.NativeObject
1417
sil @borrow_test : $@convention(thin) (@in Builtin.NativeObject, Builtin.NativeObject) -> () {
1518
bb0(%0 : $*Builtin.NativeObject, %1 : $Builtin.NativeObject):
19+
%2 = begin_borrow %1 : $Builtin.NativeObject
20+
end_borrow %2 from %1 : $Builtin.NativeObject, $Builtin.NativeObject
21+
22+
%3 = alloc_stack $Builtin.NativeObject
23+
store_borrow %1 to %3 : $*Builtin.NativeObject
24+
end_borrow %3 from %1 : $*Builtin.NativeObject, $Builtin.NativeObject
25+
dealloc_stack %3 : $*Builtin.NativeObject
26+
1627
end_borrow %0 from %1 : $*Builtin.NativeObject, $Builtin.NativeObject
1728
end_borrow %1 from %0 : $Builtin.NativeObject, $*Builtin.NativeObject
1829
end_borrow %0 from %0 : $*Builtin.NativeObject, $*Builtin.NativeObject
1930
end_borrow %1 from %1 : $Builtin.NativeObject, $Builtin.NativeObject
20-
%2 = tuple()
21-
return %2 : $()
22-
}
31+
%4 = tuple()
32+
return %4 : $()
33+
}

test/SIL/Serialization/borrow.sil

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,27 @@ import Builtin
1212
// We do not verify here, but just make sure that all of the combinations parse and print correctly.
1313
// CHECK-LABEL: sil @borrow_test : $@convention(thin) (@in Builtin.NativeObject, Builtin.NativeObject) -> () {
1414
// CHECK: bb0([[ARG1:%[0-9]+]] : $*Builtin.NativeObject, [[ARG2:%[0-9]+]] : $Builtin.NativeObject):
15+
// CHECK: begin_borrow [[ARG2]]
16+
// CHECK: [[MEM:%.*]] = alloc_stack $Builtin.NativeObject
17+
// CHECK: store_borrow [[ARG2]] to [[MEM]] : $*Builtin.NativeObject
1518
// CHECK: end_borrow [[ARG1]] from [[ARG2]] : $*Builtin.NativeObject, $Builtin.NativeObject
1619
// CHECK: end_borrow [[ARG2]] from [[ARG1]] : $Builtin.NativeObject, $*Builtin.NativeObject
1720
// CHECK: end_borrow [[ARG1]] from [[ARG1]] : $*Builtin.NativeObject, $*Builtin.NativeObject
1821
// CHECK: end_borrow [[ARG2]] from [[ARG2]] : $Builtin.NativeObject, $Builtin.NativeObject
1922
sil @borrow_test : $@convention(thin) (@in Builtin.NativeObject, Builtin.NativeObject) -> () {
2023
bb0(%0 : $*Builtin.NativeObject, %1 : $Builtin.NativeObject):
24+
%2 = begin_borrow %1 : $Builtin.NativeObject
25+
end_borrow %2 from %1 : $Builtin.NativeObject, $Builtin.NativeObject
26+
27+
%3 = alloc_stack $Builtin.NativeObject
28+
store_borrow %1 to %3 : $*Builtin.NativeObject
29+
end_borrow %3 from %1 : $*Builtin.NativeObject, $Builtin.NativeObject
30+
dealloc_stack %3 : $*Builtin.NativeObject
31+
2132
end_borrow %0 from %1 : $*Builtin.NativeObject, $Builtin.NativeObject
2233
end_borrow %1 from %0 : $Builtin.NativeObject, $*Builtin.NativeObject
2334
end_borrow %0 from %0 : $*Builtin.NativeObject, $*Builtin.NativeObject
2435
end_borrow %1 from %1 : $Builtin.NativeObject, $Builtin.NativeObject
25-
%2 = tuple()
26-
return %2 : $()
36+
%4 = tuple()
37+
return %4 : $()
2738
}

0 commit comments

Comments
 (0)