@@ -554,6 +554,18 @@ collectStackClosureLifetimeEnds(SmallVectorImpl<SILInstruction *> &lifetimeEnds,
554
554
}
555
555
}
556
556
557
+ static bool lookThroughMarkDependenceChainForValue (MarkDependenceInst *mark,
558
+ PartialApplyInst *pai) {
559
+ if (mark->getValue () == pai) {
560
+ return true ;
561
+ }
562
+ auto *markChain = dyn_cast<MarkDependenceInst>(mark->getValue ());
563
+ if (!markChain) {
564
+ return false ;
565
+ }
566
+ return lookThroughMarkDependenceChainForValue (markChain, pai);
567
+ }
568
+
557
569
// / Rewrite a partial_apply convert_escape_to_noescape sequence with a single
558
570
// / apply/try_apply user to a partial_apply [stack] terminated with a
559
571
// / dealloc_stack placed after the apply.
@@ -736,6 +748,7 @@ static SILValue tryRewriteToPartialApplyStack(
736
748
newPA->getOrigCalleeType ()->getNumParameters () - newPA->getNumArguments ();
737
749
738
750
MarkDependenceInst *markDepChain = nullptr ;
751
+
739
752
for (unsigned i : indices (newPA->getArgumentOperands ())) {
740
753
auto &arg = newPA->getArgumentOperands ()[i];
741
754
SILValue copy = arg.get ();
@@ -798,14 +811,14 @@ static SILValue tryRewriteToPartialApplyStack(
798
811
continue ;
799
812
}
800
813
801
- // If we're marking dependence of the current partial_apply on this
802
- // stack slot , that's fine.
803
- if (mark-> getValue () != newPA
804
- || mark->getBase () != stack) {
814
+ // If we're marking dependence on this stack slot for the current
815
+ // partial_apply or it's chain of mark_dependences , that's fine.
816
+ if (! lookThroughMarkDependenceChainForValue (mark, newPA) ||
817
+ mark->getBase () != stack) {
805
818
LLVM_DEBUG (llvm::dbgs () << " -- had unexpected mark_dependence use\n " ;
806
819
use->getUser ()->print (llvm::dbgs ());
807
820
llvm::dbgs () << " \n " );
808
-
821
+ initialization = nullptr ;
809
822
break ;
810
823
}
811
824
markDep = mark;
0 commit comments