@@ -3612,6 +3612,23 @@ class AssignAddressToDef : SILInstructionVisitor<AssignAddressToDef> {
3612
3612
singleValueInstructionFallback (kp);
3613
3613
}
3614
3614
3615
+ void visitBeginApplyInst (BeginApplyInst *apply) {
3616
+ auto builder = assignment.getBuilder (++apply->getIterator ());
3617
+ auto addr = assignment.createAllocStack (origValue->getType ());
3618
+ assignment.mapValueToAddress (origValue, addr);
3619
+ for (auto &opd : apply->getAllOperands ()) {
3620
+ if (assignment.contains (opd.get ())) {
3621
+ auto builder = assignment.getBuilder (apply->getIterator ());
3622
+ auto loaded = builder.createLoad (
3623
+ apply->getLoc (), assignment.getAddressForValue (opd.get ()),
3624
+ LoadOwnershipQualifier::Unqualified);
3625
+ opd.set (loaded);
3626
+ }
3627
+ }
3628
+ builder.createStore (apply->getLoc (), origValue, addr,
3629
+ StoreOwnershipQualifier::Unqualified);
3630
+ }
3631
+
3615
3632
void visitApplyInst (ApplyInst *apply) {
3616
3633
// The loadable by address transformation ignores large tuple return types.
3617
3634
auto builder = assignment.getBuilder (++apply->getIterator ());
@@ -3865,6 +3882,8 @@ class RewriteUser : SILInstructionVisitor<RewriteUser> {
3865
3882
userInstructionFallback (kp);
3866
3883
}
3867
3884
3885
+ void visitYieldInst (YieldInst *yield) { userInstructionFallback (yield); }
3886
+
3868
3887
void visitFixLifetimeInst (FixLifetimeInst *f) {
3869
3888
auto addr = assignment.getAddressForValue (f->getOperand ());
3870
3889
auto builder = assignment.getBuilder (f->getIterator ());
0 commit comments