@@ -183,6 +183,7 @@ struct SILDynamicCastInst {
183
183
CastConsumptionKind getBridgedConsumptionKind () const {
184
184
switch (getKind ()) {
185
185
case SILDynamicCastKind::CheckedCastAddrBranchInst:
186
+ return cast<CheckedCastAddrBranchInst>(inst)->getConsumptionKind ();
186
187
case SILDynamicCastKind::CheckedCastBranchInst:
187
188
case SILDynamicCastKind::CheckedCastValueBranchInst:
188
189
llvm_unreachable (" unsupported" );
@@ -210,7 +211,7 @@ struct SILDynamicCastInst {
210
211
SILBasicBlock *getSuccessBlock () {
211
212
switch (getKind ()) {
212
213
case SILDynamicCastKind::CheckedCastAddrBranchInst:
213
- llvm_unreachable ( " unsupported " );
214
+ return cast<CheckedCastAddrBranchInst>(inst)-> getSuccessBB ( );
214
215
case SILDynamicCastKind::CheckedCastBranchInst:
215
216
return cast<CheckedCastBranchInst>(inst)->getSuccessBB ();
216
217
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -246,7 +247,7 @@ struct SILDynamicCastInst {
246
247
SILBasicBlock *getFailureBlock () {
247
248
switch (getKind ()) {
248
249
case SILDynamicCastKind::CheckedCastAddrBranchInst:
249
- llvm_unreachable ( " unsupported " );
250
+ return cast<CheckedCastAddrBranchInst>(inst)-> getFailureBB ( );
250
251
case SILDynamicCastKind::CheckedCastBranchInst:
251
252
return cast<CheckedCastBranchInst>(inst)->getFailureBB ();
252
253
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -282,7 +283,7 @@ struct SILDynamicCastInst {
282
283
SILValue getSource () const {
283
284
switch (getKind ()) {
284
285
case SILDynamicCastKind::CheckedCastAddrBranchInst:
285
- llvm_unreachable ( " unsupported " );
286
+ return cast<CheckedCastAddrBranchInst>(inst)-> getSrc ( );
286
287
case SILDynamicCastKind::CheckedCastBranchInst:
287
288
return cast<CheckedCastBranchInst>(inst)->getOperand ();
288
289
case SILDynamicCastKind::CheckedCastValueBranchInst:
@@ -300,6 +301,7 @@ struct SILDynamicCastInst {
300
301
SILValue getDest () const {
301
302
switch (getKind ()) {
302
303
case SILDynamicCastKind::CheckedCastAddrBranchInst:
304
+ return cast<CheckedCastAddrBranchInst>(inst)->getDest ();
303
305
case SILDynamicCastKind::CheckedCastBranchInst:
304
306
case SILDynamicCastKind::CheckedCastValueBranchInst:
305
307
llvm_unreachable (" unsupported" );
@@ -318,6 +320,7 @@ struct SILDynamicCastInst {
318
320
CanType getSourceType () const {
319
321
switch (getKind ()) {
320
322
case SILDynamicCastKind::CheckedCastAddrBranchInst:
323
+ return cast<CheckedCastAddrBranchInst>(inst)->getSourceType ();
321
324
case SILDynamicCastKind::CheckedCastBranchInst:
322
325
case SILDynamicCastKind::CheckedCastValueBranchInst:
323
326
llvm_unreachable (" unsupported" );
@@ -350,6 +353,7 @@ struct SILDynamicCastInst {
350
353
CanType getTargetType () const {
351
354
switch (getKind ()) {
352
355
case SILDynamicCastKind::CheckedCastAddrBranchInst:
356
+ return cast<CheckedCastAddrBranchInst>(inst)->getTargetType ();
353
357
case SILDynamicCastKind::CheckedCastBranchInst:
354
358
case SILDynamicCastKind::CheckedCastValueBranchInst:
355
359
llvm_unreachable (" unsupported" );
@@ -384,10 +388,10 @@ struct SILDynamicCastInst {
384
388
385
389
bool isSourceTypeExact () const {
386
390
switch (getKind ()) {
387
- case SILDynamicCastKind::CheckedCastAddrBranchInst:
388
391
case SILDynamicCastKind::CheckedCastBranchInst:
389
392
case SILDynamicCastKind::CheckedCastValueBranchInst:
390
393
llvm_unreachable (" unsupported" );
394
+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
391
395
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
392
396
case SILDynamicCastKind::UnconditionalCheckedCastInst:
393
397
return isa<MetatypeInst>(getSource ());
@@ -417,17 +421,25 @@ struct SILDynamicCastInst {
417
421
418
422
bool isConditional () const {
419
423
switch (getKind ()) {
420
- case SILDynamicCastKind::CheckedCastAddrBranchInst:
421
424
case SILDynamicCastKind::CheckedCastBranchInst:
422
425
case SILDynamicCastKind::CheckedCastValueBranchInst:
423
426
llvm_unreachable (" unsupported" );
427
+ case SILDynamicCastKind::CheckedCastAddrBranchInst: {
428
+ auto f = classifyFeasibility (true /* allow wmo*/ );
429
+ return f == DynamicCastFeasibility::MaySucceed;
430
+ }
424
431
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
425
432
case SILDynamicCastKind::UnconditionalCheckedCastInst:
426
433
return false ;
427
434
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
428
435
llvm_unreachable (" unsupported" );
429
436
}
430
437
}
438
+
439
+ bool canUseScalarCheckedCastInstructions () const {
440
+ return swift::canUseScalarCheckedCastInstructions (
441
+ getModule (), getSourceType (), getTargetType ());
442
+ }
431
443
};
432
444
433
445
} // end namespace swift
0 commit comments