@@ -32,6 +32,7 @@ class SILLocation;
32
32
class SILModule ;
33
33
class SILType ;
34
34
enum class CastConsumptionKind : unsigned char ;
35
+ struct SILDynamicCastInst ;
35
36
36
37
enum class DynamicCastFeasibility {
37
38
// / The cast will always succeed.
@@ -74,6 +75,9 @@ bool emitSuccessfulIndirectUnconditionalCast(
74
75
SILValue dest, CanType targetType,
75
76
SILInstruction *existingCast = nullptr );
76
77
78
+ bool emitSuccessfulIndirectUnconditionalCast (SILBuilder &B, SILLocation loc,
79
+ SILDynamicCastInst dynamicCast);
80
+
77
81
// / Can the given cast be performed by the scalar checked-cast
78
82
// / instructions, or does we need to use the indirect instructions?
79
83
bool canUseScalarCheckedCastInstructions (SILModule &M,
@@ -173,6 +177,20 @@ struct SILDynamicCastInst {
173
177
174
178
SILInstruction *getInstruction () const { return inst; }
175
179
180
+ CastConsumptionKind getBridgedConsumptionKind () const {
181
+ switch (getKind ()) {
182
+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
183
+ case SILDynamicCastKind::CheckedCastBranchInst:
184
+ case SILDynamicCastKind::CheckedCastValueBranchInst:
185
+ llvm_unreachable (" unsupported" );
186
+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187
+ return CastConsumptionKind::TakeAlways;
188
+ case SILDynamicCastKind::UnconditionalCheckedCastInst:
189
+ case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190
+ llvm_unreachable (" unsupported" );
191
+ }
192
+ }
193
+
176
194
CastConsumptionKind getConsumptionKind () const {
177
195
switch (getKind ()) {
178
196
case SILDynamicCastKind::CheckedCastAddrBranchInst:
@@ -181,7 +199,7 @@ struct SILDynamicCastInst {
181
199
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
182
200
case SILDynamicCastKind::UnconditionalCheckedCastInst:
183
201
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
184
- llvm_unreachable (" unsupported query " );
202
+ llvm_unreachable (" unsupported" );
185
203
}
186
204
}
187
205
@@ -190,10 +208,12 @@ struct SILDynamicCastInst {
190
208
case SILDynamicCastKind::CheckedCastAddrBranchInst:
191
209
case SILDynamicCastKind::CheckedCastBranchInst:
192
210
case SILDynamicCastKind::CheckedCastValueBranchInst:
211
+ llvm_unreachable (" unsupported" );
193
212
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
213
+ return nullptr ;
194
214
case SILDynamicCastKind::UnconditionalCheckedCastInst:
195
215
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
196
- llvm_unreachable (" Unsupported query " );
216
+ llvm_unreachable (" unsupported " );
197
217
}
198
218
}
199
219
@@ -206,10 +226,12 @@ struct SILDynamicCastInst {
206
226
case SILDynamicCastKind::CheckedCastAddrBranchInst:
207
227
case SILDynamicCastKind::CheckedCastBranchInst:
208
228
case SILDynamicCastKind::CheckedCastValueBranchInst:
229
+ llvm_unreachable (" unsupported" );
209
230
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
231
+ return nullptr ;
210
232
case SILDynamicCastKind::UnconditionalCheckedCastInst:
211
233
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
212
- llvm_unreachable (" Unsupported query " );
234
+ llvm_unreachable (" unsupported " );
213
235
}
214
236
}
215
237
@@ -222,7 +244,9 @@ struct SILDynamicCastInst {
222
244
case SILDynamicCastKind::CheckedCastAddrBranchInst:
223
245
case SILDynamicCastKind::CheckedCastBranchInst:
224
246
case SILDynamicCastKind::CheckedCastValueBranchInst:
247
+ llvm_unreachable (" unsupported" );
225
248
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249
+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
226
250
case SILDynamicCastKind::UnconditionalCheckedCastInst:
227
251
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
228
252
llvm_unreachable (" unsupported" );
@@ -235,7 +259,9 @@ struct SILDynamicCastInst {
235
259
case SILDynamicCastKind::CheckedCastAddrBranchInst:
236
260
case SILDynamicCastKind::CheckedCastBranchInst:
237
261
case SILDynamicCastKind::CheckedCastValueBranchInst:
262
+ llvm_unreachable (" unsupported" );
238
263
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264
+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
239
265
case SILDynamicCastKind::UnconditionalCheckedCastInst:
240
266
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
241
267
llvm_unreachable (" unimplemented" );
@@ -247,7 +273,9 @@ struct SILDynamicCastInst {
247
273
case SILDynamicCastKind::CheckedCastAddrBranchInst:
248
274
case SILDynamicCastKind::CheckedCastBranchInst:
249
275
case SILDynamicCastKind::CheckedCastValueBranchInst:
276
+ llvm_unreachable (" unsupported" );
250
277
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278
+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
251
279
case SILDynamicCastKind::UnconditionalCheckedCastInst:
252
280
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
253
281
llvm_unreachable (" unsupported" );
@@ -259,7 +287,11 @@ struct SILDynamicCastInst {
259
287
case SILDynamicCastKind::CheckedCastAddrBranchInst:
260
288
case SILDynamicCastKind::CheckedCastBranchInst:
261
289
case SILDynamicCastKind::CheckedCastValueBranchInst:
262
- case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
290
+ llvm_unreachable (" unsupported" );
291
+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
292
+ auto *uccai = cast<UnconditionalCheckedCastAddrInst>(inst);
293
+ return uccai->getSrc ()->getType ();
294
+ }
263
295
case SILDynamicCastKind::UnconditionalCheckedCastInst:
264
296
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
265
297
llvm_unreachable (" unsupported" );
@@ -271,7 +303,9 @@ struct SILDynamicCastInst {
271
303
case SILDynamicCastKind::CheckedCastAddrBranchInst:
272
304
case SILDynamicCastKind::CheckedCastBranchInst:
273
305
case SILDynamicCastKind::CheckedCastValueBranchInst:
306
+ llvm_unreachable (" unsupported" );
274
307
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308
+ return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
275
309
case SILDynamicCastKind::UnconditionalCheckedCastInst:
276
310
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
277
311
llvm_unreachable (" unimplemented" );
@@ -283,7 +317,11 @@ struct SILDynamicCastInst {
283
317
case SILDynamicCastKind::CheckedCastAddrBranchInst:
284
318
case SILDynamicCastKind::CheckedCastBranchInst:
285
319
case SILDynamicCastKind::CheckedCastValueBranchInst:
286
- case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
320
+ llvm_unreachable (" unsupported" );
321
+ case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
322
+ auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323
+ return uccai->getDest ()->getType ();
324
+ }
287
325
case SILDynamicCastKind::UnconditionalCheckedCastInst:
288
326
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
289
327
llvm_unreachable (" unsupported" );
@@ -295,7 +333,9 @@ struct SILDynamicCastInst {
295
333
case SILDynamicCastKind::CheckedCastAddrBranchInst:
296
334
case SILDynamicCastKind::CheckedCastBranchInst:
297
335
case SILDynamicCastKind::CheckedCastValueBranchInst:
336
+ llvm_unreachable (" unsupported" );
298
337
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338
+ return isa<MetatypeInst>(getSource ());
299
339
case SILDynamicCastKind::UnconditionalCheckedCastInst:
300
340
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
301
341
llvm_unreachable (" unsupported" );
@@ -305,11 +345,12 @@ struct SILDynamicCastInst {
305
345
SILLocation getLocation () const { return inst->getLoc (); }
306
346
307
347
SILModule &getModule () const { return inst->getModule (); }
348
+ SILFunction *getFunction () const { return inst->getFunction (); }
308
349
309
- DynamicCastFeasibility classifyDynamicCast ( ) const {
350
+ DynamicCastFeasibility classifyFeasibility ( bool allowWholeModule ) const {
310
351
return swift::classifyDynamicCast (
311
352
getModule ().getSwiftModule (), getSourceType (), getTargetType (),
312
- isSourceTypeExact (), getModule ().isWholeModule ());
353
+ isSourceTypeExact (), allowWholeModule && getModule ().isWholeModule ());
313
354
}
314
355
315
356
bool isBridgingCast () const {
@@ -320,12 +361,14 @@ struct SILDynamicCastInst {
320
361
return TargetIsBridgeable != SourceIsBridgeable;
321
362
}
322
363
323
- bool isConditionalCast () const {
364
+ bool isConditional () const {
324
365
switch (getKind ()) {
325
366
case SILDynamicCastKind::CheckedCastAddrBranchInst:
326
367
case SILDynamicCastKind::CheckedCastBranchInst:
327
368
case SILDynamicCastKind::CheckedCastValueBranchInst:
369
+ llvm_unreachable (" unsupported" );
328
370
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371
+ return false ;
329
372
case SILDynamicCastKind::UnconditionalCheckedCastInst:
330
373
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
331
374
llvm_unreachable (" unsupported" );
0 commit comments