@@ -943,6 +943,29 @@ static bool isAddressInitializedAtCall(SILValue addr, SILInstruction *AI,
943
943
return true ;
944
944
}
945
945
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
+
946
969
// / Propagate information about a concrete type from init_existential_addr
947
970
// / or init_existential_ref into witness_method conformances and into
948
971
// / apply instructions.
@@ -974,19 +997,14 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
974
997
if (!CCT.isValid ())
975
998
return nullptr ;
976
999
977
- SILOpenedArchetypesTracker *OldOpenedArchetypesTracker =
978
- Builder.getOpenedArchetypesTracker ();
979
-
980
- SILOpenedArchetypesTracker OpenedArchetypesTracker (Apply.getFunction ());
981
-
1000
+ RAIIOpenedArchetypesTracker tempTracker (Builder);
982
1001
if (CCT.ConcreteType ->isOpenedExistential ()) {
983
1002
// Temporarily record this opened existential def. Don't permanently record
984
1003
// in the Builder's tracker because this opened existential's original
985
1004
// dominating def may not have been recorded yet.
986
1005
// FIXME: Redesign the tracker. This is not robust.
987
- OpenedArchetypesTracker .addOpenedArchetypeDef (
1006
+ tempTracker. getTracker () .addOpenedArchetypeDef (
988
1007
cast<ArchetypeType>(CCT.ConcreteType ), CCT.ConcreteTypeDef );
989
- Builder.setOpenedArchetypesTracker (&OpenedArchetypesTracker);
990
1008
}
991
1009
992
1010
// Propagate the concrete type into the callee-operand if required.
@@ -1006,8 +1024,6 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
1006
1024
cast<InitExistentialAddrInst>(InitExistential)->getOperand ();
1007
1025
return isAddressInitializedAtCall (existentialAddr, AI, DT);
1008
1026
};
1009
-
1010
- // FIXME: Intentionally preserve this bug to avoid changing functionality.
1011
1027
if (isCopied && !canReplaceCopiedSelf ())
1012
1028
return nullptr ;
1013
1029
@@ -1017,9 +1033,6 @@ SILInstruction *SILCombiner::propagateConcreteTypeOfInitExistential(
1017
1033
Apply, CCT.NewSelf , Self, CCT.ConcreteType , CCT.ConcreteTypeDef ,
1018
1034
CCT.getConformance (), OpenedArchetype);
1019
1035
1020
- if (CCT.ConcreteType ->isOpenedExistential ())
1021
- Builder.setOpenedArchetypesTracker (OldOpenedArchetypesTracker);
1022
-
1023
1036
return NewAI;
1024
1037
}
1025
1038
0 commit comments