4
4
#include " swift/SIL/TypeSubstCloner.h"
5
5
#include " swift/SIL/SILInstruction.h"
6
6
#include " swift/SILOptimizer/PassManager/Transforms.h"
7
+ #include " swift/SILOptimizer/Utils/CFG.h"
7
8
8
9
9
10
using namespace swift ;
@@ -21,6 +22,8 @@ class OpaqueSpecializerCloner
21
22
22
23
public:
23
24
friend class SILCloner <OpaqueSpecializerCloner>;
25
+ friend class SILInstructionVisitor <OpaqueSpecializerCloner>;
26
+
24
27
OpaqueSpecializerCloner (SubstitutionMap opaqueArchetypeSubs, SILFunction &fun)
25
28
: SuperTy(fun, fun, opaqueArchetypeSubs) {
26
29
entryBlock = fun.getEntryBlock ();
@@ -38,8 +41,50 @@ class OpaqueSpecializerCloner
38
41
insertOpaqueToConcreteAddressCasts (orig, cloned);
39
42
}
40
43
41
- void visitTerminator (SILBasicBlock *BB) { visit (BB->getTerminator ()); }
44
+ void visitTerminator (SILBasicBlock *BB) {
45
+ visit (BB->getTerminator ());
46
+ }
47
+
48
+ void visitReturnInst (ReturnInst *Inst) {
49
+ getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
50
+ auto origResult = Inst->getOperand ();
51
+ auto clonedResult = getOpValue (Inst->getOperand ());
52
+ if (clonedResult->getType ().getASTType () != origResult->getType ().getASTType ())
53
+ clonedResult = getBuilder ().createUncheckedRefCast (
54
+ RegularLocation::getAutoGeneratedLocation (), clonedResult,
55
+ origResult->getType ());
56
+ recordClonedInstruction (
57
+ Inst,
58
+ getBuilder ().createReturn (getOpLocation (Inst->getLoc ()), clonedResult));
59
+ }
60
+
61
+ void visitYieldInst (YieldInst *Inst) {
62
+ auto OrigValues = Inst->getYieldedValues ();
63
+ auto Values = getOpValueArray<8 >(Inst->getYieldedValues ());
64
+ auto ResumeBB = getOpBasicBlock (Inst->getResumeBB ());
65
+ auto UnwindBB = getOpBasicBlock (Inst->getUnwindBB ());
66
+ for (auto idx : indices (Values)) {
67
+ if (OrigValues[idx]->getType ().getASTType () !=
68
+ Values[idx]->getType ().getASTType ()) {
69
+ if (!Values[idx]->getType ().isAddress ()) {
70
+ Values[idx] = getBuilder ().createUncheckedRefCast (
71
+ RegularLocation::getAutoGeneratedLocation (), Values[idx],
72
+ OrigValues[idx]->getType ());
73
+ } else {
74
+ Values[idx] = getBuilder ().createUncheckedAddrCast (
75
+ RegularLocation::getAutoGeneratedLocation (), Values[idx],
76
+ OrigValues[idx]->getType ());
77
+ }
78
+ }
79
+ }
80
+
81
+ getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
82
+ recordClonedInstruction (
83
+ Inst, getBuilder ().createYield (getOpLocation (Inst->getLoc ()), Values,
84
+ ResumeBB, UnwindBB));
85
+ }
42
86
87
+ protected:
43
88
SILType remapType (SILType Ty) {
44
89
SILType &Sty = TypeCache[Ty];
45
90
if (!Sty) {
@@ -97,26 +142,52 @@ void OpaqueSpecializerCloner::clone() {
97
142
void OpaqueSpecializerCloner::insertOpaqueToConcreteAddressCasts (
98
143
SILInstruction *orig, SILInstruction *cloned) {
99
144
145
+ if (isa<ReturnInst>(cloned) || isa<YieldInst>(cloned))
146
+ return ;
147
+
100
148
// Replace apply operands.
101
- auto apply = ApplySite::isa (cloned);
102
- if (!apply)
149
+ if (auto apply = ApplySite::isa (cloned)) {
150
+ SavedInsertionPointRAII restore (getBuilder ());
151
+ getBuilder ().setInsertionPoint (apply.getInstruction ());
152
+ auto substConv = apply.getSubstCalleeConv ();
153
+ unsigned idx = 0 ;
154
+ for (auto &opd : apply.getArgumentOperands ()) {
155
+ auto argConv = apply.getArgumentConvention (opd);
156
+ auto argIdx = apply.getCalleeArgIndex (opd);
157
+ auto argType = substConv.getSILArgumentType (argIdx);
158
+ if (argType.getASTType () != opd.get ()->getType ().getASTType ()) {
159
+ if (argConv.isIndirectConvention ()) {
160
+ auto cast = getBuilder ().createUncheckedAddrCast (apply.getLoc (),
161
+ opd.get (), argType);
162
+ opd.set (cast);
163
+ } else {
164
+ auto cast = getBuilder ().createUncheckedRefCast (apply.getLoc (),
165
+ opd.get (), argType);
166
+ opd.set (cast);
167
+ }
168
+ }
169
+ ++idx;
170
+ }
103
171
return ;
172
+ }
104
173
105
- SavedInsertionPointRAII restore (getBuilder ());
106
- getBuilder ().setInsertionPoint (apply.getInstruction ());
107
- auto substConv = apply.getSubstCalleeConv ();
108
174
unsigned idx = 0 ;
109
- for (auto &opd : apply.getArgumentOperands ()) {
110
- auto argConv = apply.getArgumentConvention (opd);
111
- auto argIdx = apply.getCalleeArgIndex (opd);
112
- auto argType = substConv.getSILArgumentType (argIdx);
113
- if (argConv.isIndirectConvention () &&
114
- argType.getASTType () != opd.get ()->getType ().getASTType ()) {
115
- auto cast = getBuilder ().createUncheckedAddrCast (apply.getLoc (),
116
- opd.get (), argType);
117
- opd.set (cast);
175
+ for (auto &opd : cloned->getAllOperands ()) {
176
+ auto origType = orig->getOperand (idx)->getType ();
177
+ auto clonedType = opd.get ()->getType ();
178
+ if (clonedType.getASTType () != origType.getASTType ()) {
179
+ SavedInsertionPointRAII restore (getBuilder ());
180
+ getBuilder ().setInsertionPoint (cloned);
181
+ if (origType.isAddress ()) {
182
+ auto cast = getBuilder ().createUncheckedAddrCast (cloned->getLoc (),
183
+ opd.get (), clonedType);
184
+ opd.set (cast);
185
+ } else {
186
+ auto cast = getBuilder ().createUncheckedRefCast (cloned->getLoc (),
187
+ opd.get (), clonedType);
188
+ opd.set (cast);
189
+ }
118
190
}
119
- ++idx;
120
191
}
121
192
}
122
193
@@ -128,6 +199,14 @@ class OpaqueArchetypeSpecializer : public SILFunctionTransform {
128
199
bool foundOpaqueArchetype = false ;
129
200
for (auto &BB : *getFunction ()) {
130
201
for (auto &inst : BB) {
202
+ for (auto &opd : inst.getAllOperands ()) {
203
+ if (!opd.get ()->getType ().getASTType ()->hasOpaqueArchetype ())
204
+ continue ;
205
+ foundOpaqueArchetype = true ;
206
+ break ;
207
+ }
208
+ if (foundOpaqueArchetype)
209
+ break ;
131
210
auto *allocStack = dyn_cast<AllocStackInst>(&inst);
132
211
if (!allocStack ||
133
212
!allocStack->getElementType ().getASTType ()->hasOpaqueArchetype ())
@@ -141,6 +220,7 @@ class OpaqueArchetypeSpecializer : public SILFunctionTransform {
141
220
SubstitutionMap subsMap = getFunction ()->getForwardingSubstitutionMap ();
142
221
OpaqueSpecializerCloner s (subsMap, *getFunction ());
143
222
s.clone ();
223
+ removeUnreachableBlocks (*getFunction ());
144
224
}
145
225
146
226
if (foundOpaqueArchetype)
0 commit comments