@@ -68,6 +68,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
6868 BoxToValue = 3 ,
6969 BoxToStack = 4 ,
7070 InOutToOut = 5 ,
71+ ClosurePropPreviousArg = 6 , // the same closure as a previous `ClosureProp` argument
7172
7273 First_Option = 0 ,
7374 Last_Option = 31 ,
@@ -82,8 +83,20 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
8283 LastOptionSetEntry = 32768 ,
8384 };
8485
85- using ArgInfo = std::pair<ArgumentModifierIntBase,
86- NullablePtr<SILInstruction>>;
86+ struct ArgInfo {
87+ ArgumentModifier kind;
88+ union {
89+ SILInstruction *inst;
90+ unsigned otherArgIdx; // only for `ClosurePropPreviousArg`
91+ };
92+
93+ ArgInfo (ArgumentModifier kind) : kind(kind), inst(nullptr ) {}
94+
95+ void append (ArgumentModifier modifier) {
96+ kind = ArgumentModifier (ArgumentModifierIntBase (kind) | ArgumentModifierIntBase (modifier));
97+ }
98+ };
99+
87100 // Information for each SIL argument in the original function before
88101 // specialization. This includes SIL indirect result argument required for
89102 // the original function type at the current stage of compilation.
@@ -99,9 +112,8 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
99112 void setArgumentConstantProp (unsigned OrigArgIdx, SILInstruction *constInst);
100113 void appendStringAsIdentifier (StringRef str);
101114
102- void setArgumentClosureProp (unsigned OrigArgIdx, PartialApplyInst *PAI);
103- void setArgumentClosureProp (unsigned OrigArgIdx,
104- ThinToThickFunctionInst *TTTFI);
115+ void setArgumentClosureProp (unsigned OrigArgIdx, SILInstruction *closure);
116+ void setArgumentClosurePropPreviousArg (unsigned OrigArgIdx, unsigned otherArgIdx);
105117 void setArgumentDead (unsigned OrigArgIdx);
106118 void setArgumentOwnedToGuaranteed (unsigned OrigArgIdx);
107119 void setArgumentGuaranteedToOwned (unsigned OrigArgIdx);
@@ -120,8 +132,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
120132private:
121133 void mangleConstantProp (SILInstruction *constInst);
122134 void mangleClosureProp (SILInstruction *Inst);
123- void mangleArgument (ArgumentModifierIntBase ArgMod,
124- NullablePtr<SILInstruction> Inst);
135+ void mangleArgument (ArgInfo argInfo);
125136 void mangleReturnValue (ReturnValueModifierIntBase RetMod);
126137};
127138
0 commit comments