Skip to content

Commit 17ca4d9

Browse files
committed
Optimizer: add FunctionPassContext.mangle(withChangedRepresentation original: Function)
1 parent 4c09fa6 commit 17ca4d9

File tree

5 files changed

+24
-0
lines changed

5 files changed

+24
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/PassManager/FunctionPassContext.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ struct FunctionPassContext : MutatingContext {
164164
}
165165
}
166166

167+
func mangle(withChangedRepresentation original: Function) -> String {
168+
String(taking: bridgedPassContext.mangleWithChangedRepresentation(original.bridged))
169+
}
170+
167171
func createSpecializedFunctionDeclaration(
168172
from original: Function, withName specializedFunctionName: String,
169173
withParams specializedParameters: [ParameterInfo],

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ struct BridgedPassContext {
202202
BridgedFunction bridgedOriginalFunction) const;
203203
BridgedOwnedString mangleWithExplodedPackArgs(BridgedArrayRef bridgedPackArgs,
204204
BridgedFunction applySiteCallee) const;
205+
BridgedOwnedString mangleWithChangedRepresentation(BridgedFunction applySiteCallee) const;
205206

206207
void inlineFunction(BridgedInstruction apply, bool mandatoryInline) const;
207208
BRIDGED_INLINE bool eliminateDeadAllocations(BridgedFunction f) const;

include/swift/SILOptimizer/Utils/SpecializationMangler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
104104

105105
ReturnValueModifierIntBase ReturnValue;
106106

107+
bool changedRepresentation = false;
108+
107109
public:
108110
FunctionSignatureSpecializationMangler(ASTContext &Ctx, SpecializationPass Pass,
109111
swift::SerializedKind_t Serialized,
@@ -123,6 +125,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
123125
void setArgumentBoxToStack(unsigned OrigArgIdx);
124126
void setArgumentInOutToOut(unsigned OrigArgIdx);
125127
void setReturnValueOwnedToUnowned();
128+
void setChangedRepresentation() { changedRepresentation = true; }
126129

127130
// For effects
128131
void setRemovedEffect(EffectKind effect);

lib/SILOptimizer/Utils/OptimizerBridging.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,17 @@ BridgedOwnedString BridgedPassContext::mangleWithExplodedPackArgs(
351351
return BridgedOwnedString(mangler.mangle());
352352
}
353353

354+
BridgedOwnedString BridgedPassContext::mangleWithChangedRepresentation(BridgedFunction applySiteCallee) const {
355+
auto pass = Demangle::SpecializationPass::EmbeddedWitnessCallSpecialization;
356+
357+
Mangle::FunctionSignatureSpecializationMangler mangler(
358+
applySiteCallee.getFunction()->getASTContext(),
359+
pass, IsNotSerialized, applySiteCallee.getFunction());
360+
361+
mangler.setChangedRepresentation();
362+
return BridgedOwnedString(mangler.mangle());
363+
}
364+
354365
void BridgedPassContext::fixStackNesting(BridgedFunction function) const {
355366
switch (StackNesting::fixNesting(function.getFunction())) {
356367
case StackNesting::Changes::None:

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,11 @@ std::string FunctionSignatureSpecializationMangler::mangle() {
352352
ArgOpStorage.clear();
353353
beginMangling();
354354

355+
if (changedRepresentation) {
356+
appendSpecializationOperator("Tfr");
357+
return finalize();
358+
}
359+
355360
for (unsigned i : indices(OrigArgs)) {
356361
mangleArgument(OrigArgs[i]);
357362
}

0 commit comments

Comments
 (0)