@@ -183,9 +183,13 @@ struct SILDynamicCastInst {
183
183
CastConsumptionKind getBridgedConsumptionKind () const {
184
184
switch (getKind ()) {
185
185
case SILDynamicCastKind::CheckedCastAddrBranchInst:
186
+ return cast<CheckedCastAddrBranchInst>(inst)->getConsumptionKind ();
187
+ // TODO: Bridged casts cannot be expressed by checked_cast_br or
188
+ // checked_cast_value_br yet. Should we ever support it, please
189
+ // review this code.
186
190
case SILDynamicCastKind::CheckedCastBranchInst:
187
191
case SILDynamicCastKind::CheckedCastValueBranchInst:
188
- llvm_unreachable ( " unsupported " ) ;
192
+ return CastConsumptionKind::CopyOnSuccess ;
189
193
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
190
194
return CastConsumptionKind::TakeAlways;
191
195
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -210,11 +214,11 @@ struct SILDynamicCastInst {
210
214
SILBasicBlock *getSuccessBlock () {
211
215
switch (getKind ()) {
212
216
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213
- llvm_unreachable ( " unsupported " );
217
+ return cast<CheckedCastAddrBranchInst>(inst)-> getSuccessBB ( );
214
218
case SILDynamicCastKind::CheckedCastBranchInst:
215
219
return cast<CheckedCastBranchInst>(inst)->getSuccessBB ();
216
220
case SILDynamicCastKind::CheckedCastValueBranchInst:
217
- llvm_unreachable ( " unsupported " );
221
+ return cast<CheckedCastValueBranchInst>(inst)-> getSuccessBB ( );
218
222
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
219
223
case SILDynamicCastKind::UnconditionalCheckedCastInst:
220
224
return nullptr ;
@@ -246,11 +250,11 @@ struct SILDynamicCastInst {
246
250
SILBasicBlock *getFailureBlock () {
247
251
switch (getKind ()) {
248
252
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249
- llvm_unreachable ( " unsupported " );
253
+ return cast<CheckedCastAddrBranchInst>(inst)-> getFailureBB ( );
250
254
case SILDynamicCastKind::CheckedCastBranchInst:
251
255
return cast<CheckedCastBranchInst>(inst)->getFailureBB ();
252
256
case SILDynamicCastKind::CheckedCastValueBranchInst:
253
- llvm_unreachable ( " unsupported " );
257
+ return cast<CheckedCastValueBranchInst>(inst)-> getFailureBB ( );
254
258
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
255
259
case SILDynamicCastKind::UnconditionalCheckedCastInst:
256
260
return nullptr ;
@@ -282,11 +286,11 @@ struct SILDynamicCastInst {
282
286
SILValue getSource () const {
283
287
switch (getKind ()) {
284
288
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285
- llvm_unreachable ( " unsupported " );
289
+ return cast<CheckedCastAddrBranchInst>(inst)-> getSrc ( );
286
290
case SILDynamicCastKind::CheckedCastBranchInst:
287
291
return cast<CheckedCastBranchInst>(inst)->getOperand ();
288
292
case SILDynamicCastKind::CheckedCastValueBranchInst:
289
- llvm_unreachable ( " unsupported " );
293
+ return cast<CheckedCastValueBranchInst>(inst)-> getOperand ( );
290
294
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
291
295
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
292
296
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -300,9 +304,11 @@ struct SILDynamicCastInst {
300
304
SILValue getDest () const {
301
305
switch (getKind ()) {
302
306
case SILDynamicCastKind::CheckedCastAddrBranchInst:
307
+ return cast<CheckedCastAddrBranchInst>(inst)->getDest ();
303
308
case SILDynamicCastKind::CheckedCastBranchInst:
304
309
case SILDynamicCastKind::CheckedCastValueBranchInst:
305
- llvm_unreachable (" unsupported" );
310
+ // TODO: Shouldn't this return getSuccessBlock()->getArgument(0)?
311
+ return SILValue ();
306
312
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
307
313
return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
308
314
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -318,9 +324,11 @@ struct SILDynamicCastInst {
318
324
CanType getSourceType () const {
319
325
switch (getKind ()) {
320
326
case SILDynamicCastKind::CheckedCastAddrBranchInst:
327
+ return cast<CheckedCastAddrBranchInst>(inst)->getSourceType ();
321
328
case SILDynamicCastKind::CheckedCastBranchInst:
329
+ return cast<CheckedCastBranchInst>(inst)->getSourceType ();
322
330
case SILDynamicCastKind::CheckedCastValueBranchInst:
323
- llvm_unreachable ( " unsupported " );
331
+ return cast<CheckedCastValueBranchInst>(inst)-> getSourceType ( );
324
332
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
325
333
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
326
334
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -350,9 +358,11 @@ struct SILDynamicCastInst {
350
358
CanType getTargetType () const {
351
359
switch (getKind ()) {
352
360
case SILDynamicCastKind::CheckedCastAddrBranchInst:
361
+ return cast<CheckedCastAddrBranchInst>(inst)->getTargetType ();
353
362
case SILDynamicCastKind::CheckedCastBranchInst:
363
+ return cast<CheckedCastBranchInst>(inst)->getTargetType ();
354
364
case SILDynamicCastKind::CheckedCastValueBranchInst:
355
- llvm_unreachable ( " unsupported " );
365
+ return cast<CheckedCastValueBranchInst>(inst)-> getTargetType ( );
356
366
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
357
367
return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
358
368
case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -369,7 +379,7 @@ struct SILDynamicCastInst {
369
379
case SILDynamicCastKind::CheckedCastBranchInst:
370
380
return cast<CheckedCastBranchInst>(inst)->getCastType ();
371
381
case SILDynamicCastKind::CheckedCastValueBranchInst:
372
- llvm_unreachable ( " unsupported " );
382
+ return cast<CheckedCastValueBranchInst>(inst)-> getCastType ( );
373
383
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
374
384
auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
375
385
return uccai->getDest ()->getType ();
@@ -384,10 +394,9 @@ struct SILDynamicCastInst {
384
394
385
395
bool isSourceTypeExact () const {
386
396
switch (getKind ()) {
387
- case SILDynamicCastKind::CheckedCastAddrBranchInst:
388
- case SILDynamicCastKind::CheckedCastBranchInst:
389
397
case SILDynamicCastKind::CheckedCastValueBranchInst:
390
- llvm_unreachable (" unsupported" );
398
+ case SILDynamicCastKind::CheckedCastBranchInst:
399
+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
391
400
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
392
401
case SILDynamicCastKind::UnconditionalCheckedCastInst:
393
402
return isa<MetatypeInst>(getSource ());
@@ -417,17 +426,30 @@ struct SILDynamicCastInst {
417
426
418
427
bool isConditional () const {
419
428
switch (getKind ()) {
420
- case SILDynamicCastKind::CheckedCastAddrBranchInst:
421
- case SILDynamicCastKind::CheckedCastBranchInst:
422
- case SILDynamicCastKind::CheckedCastValueBranchInst:
423
- llvm_unreachable (" unsupported" );
429
+ case SILDynamicCastKind::CheckedCastAddrBranchInst: {
430
+ auto f = classifyFeasibility (true /* allow wmo*/ );
431
+ return f == DynamicCastFeasibility::MaySucceed;
432
+ }
433
+ case SILDynamicCastKind::CheckedCastBranchInst: {
434
+ auto f = classifyFeasibility (false /* allow wmo*/ );
435
+ return f == DynamicCastFeasibility::MaySucceed;
436
+ }
437
+ case SILDynamicCastKind::CheckedCastValueBranchInst: {
438
+ auto f = classifyFeasibility (false /* allow wmo opts*/ );
439
+ return f == DynamicCastFeasibility::MaySucceed;
440
+ }
424
441
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
425
442
case SILDynamicCastKind::UnconditionalCheckedCastInst:
426
443
return false ;
427
444
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
428
445
llvm_unreachable (" unsupported" );
429
446
}
430
447
}
448
+
449
+ bool canUseScalarCheckedCastInstructions () const {
450
+ return swift::canUseScalarCheckedCastInstructions (
451
+ getModule (), getSourceType (), getTargetType ());
452
+ }
431
453
};
432
454
433
455
} // end namespace swift
0 commit comments