@@ -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.
@@ -735,7 +747,6 @@ static SILValue tryRewriteToPartialApplyStack(
735
747
unsigned appliedArgStartIdx =
736
748
newPA->getOrigCalleeType ()->getNumParameters () - newPA->getNumArguments ();
737
749
738
- MarkDependenceInst *markDepChain = nullptr ;
739
750
for (unsigned i : indices (newPA->getArgumentOperands ())) {
740
751
auto &arg = newPA->getArgumentOperands ()[i];
741
752
SILValue copy = arg.get ();
@@ -775,6 +786,7 @@ static SILValue tryRewriteToPartialApplyStack(
775
786
CopyAddrInst *initialization = nullptr ;
776
787
MarkDependenceInst *markDep = nullptr ;
777
788
for (auto *use : stack->getUses ()) {
789
+ auto *user = use->getUser ();
778
790
// Since we removed the `dealloc_stack`s from the capture arguments,
779
791
// the only uses of this stack slot should be the initialization, the
780
792
// partial application, and possibly a mark_dependence from the
@@ -788,31 +800,19 @@ static SILValue tryRewriteToPartialApplyStack(
788
800
// %md = mark_dependence %pai on %0
789
801
// %md2 = mark_dependence %md on %1
790
802
// to tie all of those operands together on the same partial_apply.
791
- //
792
- // FIXME: Should we not be chaining like this and just emit independent
793
- // mark_dependence?
794
- if (markDepChain && mark->getValue () == markDepChain) {
795
- markDep = mark;
796
- markDepChain = mark;
797
- continue ;
798
- }
799
803
800
- // If we're marking dependence of the current partial_apply on this
801
- // stack slot, that 's fine .
802
- if (mark-> getValue () != newPA
803
- || mark->getBase () != stack) {
804
+ // Check if we're marking dependence on this stack slot for the current
805
+ // partial_apply or it 's chain of mark_dependences .
806
+ if (! lookThroughMarkDependenceChainForValue (mark, newPA) ||
807
+ mark->getBase () != stack) {
804
808
LLVM_DEBUG (llvm::dbgs () << " -- had unexpected mark_dependence use\n " ;
805
809
use->getUser ()->print (llvm::dbgs ());
806
810
llvm::dbgs () << " \n " );
807
-
811
+ initialization = nullptr ;
808
812
break ;
809
813
}
810
814
markDep = mark;
811
815
812
- if (!markDepChain) {
813
- markDepChain = mark;
814
- }
815
-
816
816
continue ;
817
817
}
818
818
@@ -840,7 +840,13 @@ static SILValue tryRewriteToPartialApplyStack(
840
840
initialization = possibleInit;
841
841
continue ;
842
842
}
843
+ if (isa<DebugValueInst>(user) || isa<DestroyAddrInst>(user) ||
844
+ isa<DeallocStackInst>(user)) {
845
+ continue ;
846
+ }
843
847
LLVM_DEBUG (llvm::dbgs () << " -- unrecognized use\n " );
848
+ // Reset initialization on an unrecognized use
849
+ initialization = nullptr ;
844
850
break ;
845
851
}
846
852
if (!initialization) {
0 commit comments