Skip to content

Commit 08b2718

Browse files
committed
SILCloner: Stop passing around origType for conformance substitution
1 parent 97be02d commit 08b2718

File tree

2 files changed

+36
-66
lines changed

2 files changed

+36
-66
lines changed

include/swift/SIL/SILCloner.h

Lines changed: 36 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -409,32 +409,16 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
409409
VarInfo->Scope = getOpScope(VarInfo->Scope);
410410
}
411411

412-
ProtocolConformanceRef getOpConformance(Type ty,
413-
ProtocolConformanceRef conformance) {
414-
auto substConf = asImpl().remapConformance(ty, conformance);
415-
416-
#ifndef NDEBUG
417-
if (substConf.isInvalid()) {
418-
llvm::errs() << "Invalid conformance in SIL cloner:\n";
419-
Functor.dump(llvm::errs());
420-
llvm::errs() << "\nconformance:\n";
421-
conformance.dump(llvm::errs());
422-
llvm::errs() << "\noriginal type:\n";
423-
ty.dump(llvm::errs());
424-
abort();
425-
}
426-
#endif
427-
428-
return substConf;
412+
ProtocolConformanceRef getOpConformance(ProtocolConformanceRef conformance) {
413+
return asImpl().remapConformance(conformance);
429414
}
430415

431416
ArrayRef<ProtocolConformanceRef>
432-
getOpConformances(Type ty,
433-
ArrayRef<ProtocolConformanceRef> conformances) {
417+
getOpConformances(ArrayRef<ProtocolConformanceRef> conformances) {
434418
SmallVector<ProtocolConformanceRef, 4> newConformances;
435419
for (auto conformance : conformances)
436-
newConformances.push_back(getOpConformance(ty, conformance));
437-
return ty->getASTContext().AllocateCopy(newConformances);
420+
newConformances.push_back(getOpConformance(conformance));
421+
return getBuilder().getASTContext().AllocateCopy(newConformances);
438422
}
439423

440424
bool isValueCloned(SILValue OrigValue) const {
@@ -558,28 +542,35 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
558542
return ty;
559543
}
560544

561-
ProtocolConformanceRef remapConformance(Type Ty, ProtocolConformanceRef C) {
562-
if (Functor.SubsMap || Ty->hasLocalArchetype()) {
545+
ProtocolConformanceRef remapConformance(ProtocolConformanceRef conformance) {
546+
auto substConf = conformance;
547+
548+
if (Functor.SubsMap || substConf.getType()->hasLocalArchetype()) {
563549
SubstOptions options = SubstFlags::SubstitutePrimaryArchetypes;
564550
if (Functor.hasLocalArchetypes())
565551
options |= SubstFlags::SubstituteLocalArchetypes;
566552

567-
C = C.subst(Functor, Functor, options);
568-
if (asImpl().shouldSubstOpaqueArchetypes())
569-
Ty = Ty.subst(Functor, Functor, options);
553+
substConf = substConf.subst(Functor, Functor, options);
554+
}
555+
556+
if (substConf.isInvalid()) {
557+
llvm::errs() << "Invalid substituted conformance in SIL cloner:\n";
558+
Functor.dump(llvm::errs());
559+
llvm::errs() << "\noriginal conformance:\n";
560+
conformance.dump(llvm::errs());
561+
abort();
570562
}
571563

572564
if (asImpl().shouldSubstOpaqueArchetypes()) {
573565
auto context = getBuilder().getTypeExpansionContext();
574566

575-
if (!Ty->hasOpaqueArchetype() ||
576-
!context.shouldLookThroughOpaqueTypeArchetypes())
577-
return C;
578-
579-
return substOpaqueTypesWithUnderlyingTypes(C, context);
567+
if (substConf.getType()->hasOpaqueArchetype() &&
568+
context.shouldLookThroughOpaqueTypeArchetypes()) {
569+
return substOpaqueTypesWithUnderlyingTypes(substConf, context);
570+
}
580571
}
581572

582-
return C;
573+
return substConf;
583574
}
584575

585576
SubstitutionMap remapSubstitutionMap(SubstitutionMap Subs) {
@@ -1135,8 +1126,7 @@ SILCloner<ImplClass>::visitAllocExistentialBoxInst(
11351126
auto origExistentialType = Inst->getExistentialType();
11361127
auto origFormalType = Inst->getFormalConcreteType();
11371128

1138-
auto conformances = getOpConformances(origFormalType,
1139-
Inst->getConformances());
1129+
auto conformances = getOpConformances(Inst->getConformances());
11401130

11411131
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
11421132
recordClonedInstruction(
@@ -2659,29 +2649,28 @@ SILCloner<ImplClass>::visitObjCSuperMethodInst(ObjCSuperMethodInst *Inst) {
26592649
template<typename ImplClass>
26602650
void
26612651
SILCloner<ImplClass>::visitWitnessMethodInst(WitnessMethodInst *Inst) {
2662-
auto lookupType = Inst->getLookupType();
2663-
auto conformance = getOpConformance(lookupType, Inst->getConformance());
2664-
auto newLookupType = getOpASTType(lookupType);
2652+
auto conformance = getOpConformance(Inst->getConformance());
2653+
auto lookupType = getOpASTType(Inst->getLookupType());
26652654

26662655
if (conformance.isConcrete()) {
2667-
CanType Ty = conformance.getConcrete()->getType()->getCanonicalType();
2656+
auto conformingType = conformance.getConcrete()->getType()->getCanonicalType();
26682657

2669-
if (Ty != newLookupType) {
2658+
if (conformingType != lookupType) {
26702659
assert(
2671-
(Ty->isExactSuperclassOf(newLookupType) ||
2660+
(conformingType->isExactSuperclassOf(lookupType) ||
26722661
getBuilder().getModule().Types.getLoweredRValueType(
2673-
getBuilder().getTypeExpansionContext(), Ty) == newLookupType) &&
2662+
getBuilder().getTypeExpansionContext(), conformingType) == lookupType) &&
26742663
"Should only create upcasts for sub class.");
26752664

26762665
// We use the super class as the new look up type.
2677-
newLookupType = Ty;
2666+
lookupType = conformingType;
26782667
}
26792668
}
26802669

26812670
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
26822671
recordClonedInstruction(Inst,
26832672
getBuilder().createWitnessMethod(
2684-
getOpLocation(Inst->getLoc()), newLookupType,
2673+
getOpLocation(Inst->getLoc()), lookupType,
26852674
conformance, Inst->getMember(), getOpType(Inst->getType())));
26862675
}
26872676

@@ -2790,8 +2779,7 @@ void
27902779
SILCloner<ImplClass>::visitInitExistentialAddrInst(InitExistentialAddrInst *Inst) {
27912780
CanType origFormalType = Inst->getFormalConcreteType();
27922781

2793-
auto conformances = getOpConformances(origFormalType,
2794-
Inst->getConformances());
2782+
auto conformances = getOpConformances(Inst->getConformances());
27952783

27962784
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
27972785
recordClonedInstruction(
@@ -2806,8 +2794,7 @@ void SILCloner<ImplClass>::visitInitExistentialValueInst(
28062794
InitExistentialValueInst *Inst) {
28072795
CanType origFormalType = Inst->getFormalConcreteType();
28082796

2809-
auto conformances = getOpConformances(origFormalType,
2810-
Inst->getConformances());
2797+
auto conformances = getOpConformances(Inst->getConformances());
28112798

28122799
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
28132800
recordClonedInstruction(
@@ -2821,9 +2808,7 @@ template<typename ImplClass>
28212808
void
28222809
SILCloner<ImplClass>::
28232810
visitInitExistentialMetatypeInst(InitExistentialMetatypeInst *Inst) {
2824-
auto origFormalType = Inst->getFormalErasedObjectType();
2825-
auto conformances = getOpConformances(origFormalType,
2826-
Inst->getConformances());
2811+
auto conformances = getOpConformances(Inst->getConformances());
28272812

28282813
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
28292814
recordClonedInstruction(Inst, getBuilder().createInitExistentialMetatype(
@@ -2837,8 +2822,7 @@ void
28372822
SILCloner<ImplClass>::
28382823
visitInitExistentialRefInst(InitExistentialRefInst *Inst) {
28392824
CanType origFormalType = Inst->getFormalConcreteType();
2840-
auto conformances = getOpConformances(origFormalType,
2841-
Inst->getConformances());
2825+
auto conformances = getOpConformances(Inst->getConformances());
28422826

28432827
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
28442828
recordClonedInstruction(

include/swift/SIL/SILInstruction.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8077,20 +8077,6 @@ class InitExistentialMetatypeInst final
80778077
SILFunction *parent);
80788078

80798079
public:
8080-
/// Return the object type which was erased. That is, if this
8081-
/// instruction erases Decoder<T>.Type.Type to Printable.Type.Type,
8082-
/// this method returns Decoder<T>.
8083-
CanType getFormalErasedObjectType() const {
8084-
auto exType = getType().getASTType();
8085-
auto concreteType = getOperand()->getType().getASTType();
8086-
while (auto exMetatype = dyn_cast<ExistentialMetatypeType>(exType)) {
8087-
exType = exMetatype->getExistentialInstanceType()->getCanonicalType();
8088-
concreteType = cast<MetatypeType>(concreteType).getInstanceType();
8089-
}
8090-
assert(exType.isExistentialType());
8091-
return concreteType;
8092-
}
8093-
80948080
ArrayRef<ProtocolConformanceRef> getConformances() const;
80958081
};
80968082

0 commit comments

Comments
 (0)