Skip to content

Commit 45b1a21

Browse files
committed
Optimizer: make ModulePassContext.specialize() also available in FunctionPassContext and add two argument flags
add `convertIndirectToDirect` and `isMandatory`
1 parent b8a4969 commit 45b1a21

File tree

6 files changed

+37
-15
lines changed

6 files changed

+37
-15
lines changed

SwiftCompilerSources/Sources/Optimizer/PassManager/FunctionPassContext.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import AST
1314
import SIL
1415
import OptimizerBridging
1516

@@ -97,6 +98,15 @@ struct FunctionPassContext : MutatingContext {
9798
return false
9899
}
99100

101+
func specialize(function: Function,
102+
for substitutions: SubstitutionMap,
103+
convertIndirectToDirect: Bool,
104+
isMandatory: Bool
105+
) -> Function? {
106+
return bridgedPassContext.specializeFunction(function.bridged, substitutions.bridged,
107+
convertIndirectToDirect, isMandatory).function
108+
}
109+
100110
func mangleOutlinedVariable(from function: Function) -> String {
101111
return String(taking: bridgedPassContext.mangleOutlinedVariable(function.bridged))
102112
}

SwiftCompilerSources/Sources/Optimizer/PassManager/ModulePassContext.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,13 @@ struct ModulePassContext : Context, CustomStringConvertible {
131131
return function.isDefinition
132132
}
133133

134-
func specialize(function: Function, for substitutions: SubstitutionMap) -> Function? {
135-
return bridgedPassContext.specializeFunction(function.bridged, substitutions.bridged).function
134+
func specialize(function: Function,
135+
for substitutions: SubstitutionMap,
136+
convertIndirectToDirect: Bool,
137+
isMandatory: Bool
138+
) -> Function? {
139+
return bridgedPassContext.specializeFunction(function.bridged, substitutions.bridged,
140+
convertIndirectToDirect, isMandatory).function
136141
}
137142

138143
enum DeserializationMode {

SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,9 @@ private struct VTableSpecializer {
8989

9090
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
9191
context.loadFunction(function: entry.implementation, loadCalleesRecursively: true),
92-
let specializedMethod = context.specialize(function: entry.implementation, for: methodSubs) else
93-
{
92+
let specializedMethod = context.specialize(function: entry.implementation, for: methodSubs,
93+
convertIndirectToDirect: true, isMandatory: true)
94+
else {
9495
return entry
9596
}
9697
notifyNewFunction(specializedMethod)
@@ -146,8 +147,9 @@ func specializeWitnessTable(for conformance: Conformance, _ context: ModulePassC
146147

147148
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
148149
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
149-
let specializedMethod = context.specialize(function: origMethod, for: methodSubs) else
150-
{
150+
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
151+
convertIndirectToDirect: true, isMandatory: true)
152+
else {
151153
return origEntry
152154
}
153155
return .method(requirement: requirement, witness: specializedMethod)
@@ -212,8 +214,9 @@ private func specializeDefaultMethods(for conformance: Conformance,
212214

213215
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
214216
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
215-
let specializedMethod = context.specialize(function: origMethod, for: methodSubs) else
216-
{
217+
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
218+
convertIndirectToDirect: true, isMandatory: true)
219+
else {
217220
return origEntry
218221
}
219222
specialized = true

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,9 @@ struct BridgedPassContext {
178178
bool tryOptimizeKeypath(BridgedInstruction apply) const;
179179
SWIFT_IMPORT_UNSAFE OptionalBridgedValue constantFoldBuiltin(BridgedInstruction builtin) const;
180180
SWIFT_IMPORT_UNSAFE OptionalBridgedFunction specializeFunction(BridgedFunction function,
181-
BridgedSubstitutionMap substitutions) const;
181+
BridgedSubstitutionMap substitutions,
182+
bool convertIndirectToDirect,
183+
bool isMandatory) const;
182184
void deserializeAllCallees(BridgedFunction function, bool deserializeAll) const;
183185
bool specializeClassMethodInst(BridgedInstruction cm) const;
184186
bool specializeWitnessMethodInst(BridgedInstruction wm) const;

lib/SILOptimizer/Utils/OptimizerBridging.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,15 @@ bool BridgedPassContext::canMakeStaticObjectReadOnly(BridgedType type) const {
173173
}
174174

175175
OptionalBridgedFunction BridgedPassContext::specializeFunction(BridgedFunction function,
176-
BridgedSubstitutionMap substitutions) const {
176+
BridgedSubstitutionMap substitutions,
177+
bool convertIndirectToDirect,
178+
bool isMandatory) const {
177179
swift::SILModule *mod = invocation->getPassManager()->getModule();
178180
SILFunction *origFunc = function.getFunction();
179181
SubstitutionMap subs = substitutions.unbridged();
180182
ReabstractionInfo ReInfo(mod->getSwiftModule(), mod->isWholeModule(),
181-
ApplySite(), origFunc, subs, IsNotSerialized,
182-
/*ConvertIndirectToDirect=*/true,
183+
ApplySite(), origFunc, subs, origFunc->getSerializedKind(),
184+
convertIndirectToDirect,
183185
/*dropUnusedArguments=*/false);
184186

185187
if (!ReInfo.canBeSpecialized()) {
@@ -188,8 +190,8 @@ OptionalBridgedFunction BridgedPassContext::specializeFunction(BridgedFunction f
188190

189191
SILOptFunctionBuilder FunctionBuilder(*invocation->getTransform());
190192

191-
GenericFuncSpecializer FuncSpecializer(FunctionBuilder, origFunc, subs,
192-
ReInfo, /*isMandatory=*/true);
193+
GenericFuncSpecializer FuncSpecializer(FunctionBuilder, origFunc, ReInfo.getClonerParamSubstitutionMap(),
194+
ReInfo, isMandatory);
193195
SILFunction *SpecializedF = FuncSpecializer.lookupSpecialization();
194196
if (!SpecializedF) SpecializedF = FuncSpecializer.tryCreateSpecialization();
195197
if (!SpecializedF || SpecializedF->getLoweredFunctionType()->hasError()) {

test/embedded/managed-buffer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// REQUIRES: swift_feature_Embedded
55

66
// CHECK: @"$e4main8MyBufferCN" = {{.*global.*}} <{ ptr @"$es13ManagedBufferCySis5UInt8VGN", ptr @"$e4main8MyBufferCfD{{[^"]*}}", ptr null, ptr @"$e4main8MyBufferC12_doNotCallMeACyt_tcfC{{[^"]*}}" }>
7-
// CHECK: @"$es13ManagedBufferCySis5UInt8VGN" = {{.*global.*}} <{ ptr null, ptr @"$es13ManagedBufferCfDSi_s5UInt8VTg5{{[^"]*}}", ptr null, ptr @"$es13ManagedBufferC12_doNotCallMeAByxq_Gyt_tcfCSi_s5UInt8VTg5{{[^"]*}}" }>
7+
// CHECK: @"$es13ManagedBufferCySis5UInt8VGN" = {{.*global.*}} <{ ptr null, ptr @"$es13ManagedBufferCfDSi_s5UInt8VTgq5{{[^"]*}}", ptr null, ptr @"$es13ManagedBufferC12_doNotCallMeAByxq_Gyt_tcfCSi_s5UInt8VTgq5{{[^"]*}}" }>
88
final public class MyBuffer: ManagedBuffer<Int, UInt8> {
99
}
1010

0 commit comments

Comments
 (0)