@@ -943,6 +943,29 @@ static bool isAddressInitializedAtCall(SILValue addr, SILInstruction *AI,
943943 return true ;
944944}
945945
946+ // / Scoped registration of opened archetypes.
947+ class RAIIOpenedArchetypesTracker {
948+ SILBuilder &B;
949+ // The original tracker may be null.
950+ SILOpenedArchetypesTracker *OldOpenedArchetypesTracker;
951+ SILOpenedArchetypesTracker OpenedArchetypesTracker;
952+
953+ public:
954+ RAIIOpenedArchetypesTracker (SILBuilder &B)
955+ : B(B), OldOpenedArchetypesTracker(B.getOpenedArchetypesTracker()),
956+ OpenedArchetypesTracker (&B.getFunction()) {
957+ B.setOpenedArchetypesTracker (&OpenedArchetypesTracker);
958+ }
959+
960+ SILOpenedArchetypesTracker &getTracker () {
961+ return OpenedArchetypesTracker;
962+ }
963+
964+ ~RAIIOpenedArchetypesTracker () {
965+ B.setOpenedArchetypesTracker (OldOpenedArchetypesTracker);
966+ }
967+ };
968+
946969// / Propagate information about a concrete type from init_existential_addr
947970// / or init_existential_ref into witness_method conformances and into
948971// / apply instructions.
@@ -974,19 +997,14 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
974997 if (!CCT.isValid ())
975998 return nullptr ;
976999
977- SILOpenedArchetypesTracker *OldOpenedArchetypesTracker =
978- Builder.getOpenedArchetypesTracker ();
979-
980- SILOpenedArchetypesTracker OpenedArchetypesTracker (Apply.getFunction ());
981-
1000+ RAIIOpenedArchetypesTracker tempTracker (Builder);
9821001 if (CCT.ConcreteType ->isOpenedExistential ()) {
9831002 // Temporarily record this opened existential def. Don't permanently record
9841003 // in the Builder's tracker because this opened existential's original
9851004 // dominating def may not have been recorded yet.
9861005 // FIXME: Redesign the tracker. This is not robust.
987- OpenedArchetypesTracker .addOpenedArchetypeDef (
1006+ tempTracker. getTracker () .addOpenedArchetypeDef (
9881007 cast<ArchetypeType>(CCT.ConcreteType ), CCT.ConcreteTypeDef );
989- Builder.setOpenedArchetypesTracker (&OpenedArchetypesTracker);
9901008 }
9911009
9921010 // Propagate the concrete type into the callee-operand if required.
@@ -1006,8 +1024,6 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
10061024 cast<InitExistentialAddrInst>(InitExistential)->getOperand ();
10071025 return isAddressInitializedAtCall (existentialAddr, AI, DT);
10081026 };
1009-
1010- // FIXME: Intentionally preserve this bug to avoid changing functionality.
10111027 if (isCopied && !canReplaceCopiedSelf ())
10121028 return nullptr ;
10131029
@@ -1017,9 +1033,6 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
10171033 Apply, CCT.NewSelf , Self, CCT.ConcreteType , CCT.ConcreteTypeDef ,
10181034 CCT.getConformance (), OpenedArchetype);
10191035
1020- if (CCT.ConcreteType ->isOpenedExistential ())
1021- Builder.setOpenedArchetypesTracker (OldOpenedArchetypesTracker);
1022-
10231036 return NewAI;
10241037}
10251038
0 commit comments