Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions SwiftCompilerSources/Sources/AST/Declarations.swift
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ final public class ClassDecl: NominalTypeDecl {

final public class ProtocolDecl: NominalTypeDecl {
public var requiresClass: Bool { bridged.ProtocolDecl_requiresClass() }
public var isMarkerProtocol: Bool { bridged.ProtocolDecl_isMarkerProtocol() }
}

final public class BuiltinTupleDecl: NominalTypeDecl {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,14 @@ private func optimize(function: Function, _ context: FunctionPassContext, _ modu
}
}

case let initExAddr as InitExistentialAddrInst:
if context.options.enableEmbeddedSwift {
for c in initExAddr.conformances where c.isConcrete && !c.protocol.isMarkerProtocol {
specializeWitnessTable(for: c, moduleContext)
worklist.addWitnessMethods(of: c, moduleContext)
}
}

case let bi as BuiltinInst:
switch bi.id {
case .BuildOrdinaryTaskExecutorRef,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ func specializeWitnessTable(for conformance: Conformance, _ context: ModulePassC
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
convertIndirectToDirect: true, isMandatory: true)
convertIndirectToDirect: false, isMandatory: true)
else {
return origEntry
}
Expand Down Expand Up @@ -215,7 +215,7 @@ private func specializeDefaultMethods(for conformance: Conformance,
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
convertIndirectToDirect: true, isMandatory: true)
convertIndirectToDirect: false, isMandatory: true)
else {
return origEntry
}
Expand Down
10 changes: 9 additions & 1 deletion SwiftCompilerSources/Sources/SIL/Instruction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,15 @@ final public
class OpenExistentialValueInst : SingleValueInstruction, UnaryInstruction {}

final public
class InitExistentialAddrInst : SingleValueInstruction, UnaryInstruction {}
class InitExistentialAddrInst : SingleValueInstruction, UnaryInstruction {
public var conformances: ConformanceArray {
ConformanceArray(bridged: bridged.InitExistentialAddrInst_getConformances())
}

public var formalConcreteType: CanonicalType {
CanonicalType(bridged: bridged.InitExistentialAddrInst_getFormalConcreteType())
}
}

final public
class DeinitExistentialAddrInst : Instruction, UnaryInstruction {}
Expand Down
1 change: 1 addition & 0 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,7 @@ struct BridgedDeclObj {
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType Class_getSuperclass() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj Class_getDestructor() const;
BRIDGED_INLINE bool ProtocolDecl_requiresClass() const;
BRIDGED_INLINE bool ProtocolDecl_isMarkerProtocol() const;
BRIDGED_INLINE bool AbstractFunction_isOverridden() const;
BRIDGED_INLINE bool Destructor_isIsolated() const;
BRIDGED_INLINE bool EnumElementDecl_hasAssociatedValues() const;
Expand Down
4 changes: 4 additions & 0 deletions include/swift/AST/ASTBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,10 @@ bool BridgedDeclObj::ProtocolDecl_requiresClass() const {
return getAs<swift::ProtocolDecl>()->requiresClass();
}

bool BridgedDeclObj::ProtocolDecl_isMarkerProtocol() const {
return getAs<swift::ProtocolDecl>()->isMarkerProtocol();
}

bool BridgedDeclObj::AbstractFunction_isOverridden() const {
return getAs<swift::AbstractFunctionDecl>()->isOverridden();
}
Expand Down
2 changes: 2 additions & 0 deletions include/swift/SIL/SILBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,8 @@ struct BridgedInstruction {
BRIDGED_INLINE bool IndexAddrInst_needsStackProtection() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformanceArray InitExistentialRefInst_getConformances() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedCanType InitExistentialRefInst_getFormalConcreteType() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformanceArray InitExistentialAddrInst_getConformances() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedCanType InitExistentialAddrInst_getFormalConcreteType() const;
BRIDGED_INLINE bool OpenExistentialAddr_isImmutable() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedGlobalVar GlobalAccessInst_getGlobal() const;
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedGlobalVar AllocGlobalInst_getGlobal() const;
Expand Down
8 changes: 8 additions & 0 deletions include/swift/SIL/SILBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1288,6 +1288,14 @@ BridgedCanType BridgedInstruction::InitExistentialRefInst_getFormalConcreteType(
return getAs<swift::InitExistentialRefInst>()->getFormalConcreteType();
}

BridgedConformanceArray BridgedInstruction::InitExistentialAddrInst_getConformances() const {
return {getAs<swift::InitExistentialAddrInst>()->getConformances()};
}

BridgedCanType BridgedInstruction::InitExistentialAddrInst_getFormalConcreteType() const {
return getAs<swift::InitExistentialAddrInst>()->getFormalConcreteType();
}

bool BridgedInstruction::OpenExistentialAddr_isImmutable() const {
switch (getAs<swift::OpenExistentialAddrInst>()->getAccessKind()) {
case swift::OpenedExistentialAccess::Immutable: return true;
Expand Down
2 changes: 2 additions & 0 deletions include/swift/SILOptimizer/Utils/Generics.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,9 @@ class ReabstractionInfo {

ReabstractionInfo(CanSILFunctionType substitutedType,
SILDeclRef methodDecl,
bool convertIndirectToDirect,
SILModule &M) :
ConvertIndirectToDirect(convertIndirectToDirect),
SubstitutedType(substitutedType),
methodDecl(methodDecl),
M(&M), isWholeModule(M.isWholeModule()) {}
Expand Down
6 changes: 4 additions & 2 deletions lib/SILOptimizer/Utils/Generics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2413,7 +2413,8 @@ bool swift::specializeClassMethodInst(ClassMethodInst *cm) {
SILType substitutedType =
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());

ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(), m);
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(),
/*convertIndirectToDirect=*/ true, m);
reInfo.createSubstitutedAndSpecializedTypes();
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
Expand Down Expand Up @@ -2465,7 +2466,8 @@ bool swift::specializeWitnessMethodInst(WitnessMethodInst *wm) {
SILType substitutedType =
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());

ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(), m);
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(),
/*convertIndirectToDirect=*/ false, m);
reInfo.createSubstitutedAndSpecializedTypes();
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
Expand Down
Loading