@@ -183,9 +183,13 @@ struct SILDynamicCastInst {
183183 CastConsumptionKind getBridgedConsumptionKind () const {
184184 switch (getKind ()) {
185185 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.
186190 case SILDynamicCastKind::CheckedCastBranchInst:
187191 case SILDynamicCastKind::CheckedCastValueBranchInst:
188- llvm_unreachable ( " unsupported " ) ;
192+ return CastConsumptionKind::CopyOnSuccess ;
189193 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
190194 return CastConsumptionKind::TakeAlways;
191195 case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -210,11 +214,11 @@ struct SILDynamicCastInst {
210214 SILBasicBlock *getSuccessBlock () {
211215 switch (getKind ()) {
212216 case SILDynamicCastKind::CheckedCastAddrBranchInst:
213- llvm_unreachable ( " unsupported " );
217+ return cast<CheckedCastAddrBranchInst>(inst)-> getSuccessBB ( );
214218 case SILDynamicCastKind::CheckedCastBranchInst:
215219 return cast<CheckedCastBranchInst>(inst)->getSuccessBB ();
216220 case SILDynamicCastKind::CheckedCastValueBranchInst:
217- llvm_unreachable ( " unsupported " );
221+ return cast<CheckedCastValueBranchInst>(inst)-> getSuccessBB ( );
218222 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
219223 case SILDynamicCastKind::UnconditionalCheckedCastInst:
220224 return nullptr ;
@@ -246,11 +250,11 @@ struct SILDynamicCastInst {
246250 SILBasicBlock *getFailureBlock () {
247251 switch (getKind ()) {
248252 case SILDynamicCastKind::CheckedCastAddrBranchInst:
249- llvm_unreachable ( " unsupported " );
253+ return cast<CheckedCastAddrBranchInst>(inst)-> getFailureBB ( );
250254 case SILDynamicCastKind::CheckedCastBranchInst:
251255 return cast<CheckedCastBranchInst>(inst)->getFailureBB ();
252256 case SILDynamicCastKind::CheckedCastValueBranchInst:
253- llvm_unreachable ( " unsupported " );
257+ return cast<CheckedCastValueBranchInst>(inst)-> getFailureBB ( );
254258 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
255259 case SILDynamicCastKind::UnconditionalCheckedCastInst:
256260 return nullptr ;
@@ -282,11 +286,11 @@ struct SILDynamicCastInst {
282286 SILValue getSource () const {
283287 switch (getKind ()) {
284288 case SILDynamicCastKind::CheckedCastAddrBranchInst:
285- llvm_unreachable ( " unsupported " );
289+ return cast<CheckedCastAddrBranchInst>(inst)-> getSrc ( );
286290 case SILDynamicCastKind::CheckedCastBranchInst:
287291 return cast<CheckedCastBranchInst>(inst)->getOperand ();
288292 case SILDynamicCastKind::CheckedCastValueBranchInst:
289- llvm_unreachable ( " unsupported " );
293+ return cast<CheckedCastValueBranchInst>(inst)-> getOperand ( );
290294 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
291295 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
292296 case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -300,9 +304,11 @@ struct SILDynamicCastInst {
300304 SILValue getDest () const {
301305 switch (getKind ()) {
302306 case SILDynamicCastKind::CheckedCastAddrBranchInst:
307+ return cast<CheckedCastAddrBranchInst>(inst)->getDest ();
303308 case SILDynamicCastKind::CheckedCastBranchInst:
304309 case SILDynamicCastKind::CheckedCastValueBranchInst:
305- llvm_unreachable (" unsupported" );
310+ // TODO: Shouldn't this return getSuccessBlock()->getArgument(0)?
311+ return SILValue ();
306312 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
307313 return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
308314 case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -318,9 +324,11 @@ struct SILDynamicCastInst {
318324 CanType getSourceType () const {
319325 switch (getKind ()) {
320326 case SILDynamicCastKind::CheckedCastAddrBranchInst:
327+ return cast<CheckedCastAddrBranchInst>(inst)->getSourceType ();
321328 case SILDynamicCastKind::CheckedCastBranchInst:
329+ return cast<CheckedCastBranchInst>(inst)->getSourceType ();
322330 case SILDynamicCastKind::CheckedCastValueBranchInst:
323- llvm_unreachable ( " unsupported " );
331+ return cast<CheckedCastValueBranchInst>(inst)-> getSourceType ( );
324332 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
325333 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
326334 case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -350,9 +358,11 @@ struct SILDynamicCastInst {
350358 CanType getTargetType () const {
351359 switch (getKind ()) {
352360 case SILDynamicCastKind::CheckedCastAddrBranchInst:
361+ return cast<CheckedCastAddrBranchInst>(inst)->getTargetType ();
353362 case SILDynamicCastKind::CheckedCastBranchInst:
363+ return cast<CheckedCastBranchInst>(inst)->getTargetType ();
354364 case SILDynamicCastKind::CheckedCastValueBranchInst:
355- llvm_unreachable ( " unsupported " );
365+ return cast<CheckedCastValueBranchInst>(inst)-> getTargetType ( );
356366 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
357367 return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
358368 case SILDynamicCastKind::UnconditionalCheckedCastInst:
@@ -369,7 +379,7 @@ struct SILDynamicCastInst {
369379 case SILDynamicCastKind::CheckedCastBranchInst:
370380 return cast<CheckedCastBranchInst>(inst)->getCastType ();
371381 case SILDynamicCastKind::CheckedCastValueBranchInst:
372- llvm_unreachable ( " unsupported " );
382+ return cast<CheckedCastValueBranchInst>(inst)-> getCastType ( );
373383 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst: {
374384 auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
375385 return uccai->getDest ()->getType ();
@@ -384,10 +394,9 @@ struct SILDynamicCastInst {
384394
385395 bool isSourceTypeExact () const {
386396 switch (getKind ()) {
387- case SILDynamicCastKind::CheckedCastAddrBranchInst:
388- case SILDynamicCastKind::CheckedCastBranchInst:
389397 case SILDynamicCastKind::CheckedCastValueBranchInst:
390- llvm_unreachable (" unsupported" );
398+ case SILDynamicCastKind::CheckedCastBranchInst:
399+ case SILDynamicCastKind::CheckedCastAddrBranchInst:
391400 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
392401 case SILDynamicCastKind::UnconditionalCheckedCastInst:
393402 return isa<MetatypeInst>(getSource ());
@@ -417,17 +426,30 @@ struct SILDynamicCastInst {
417426
418427 bool isConditional () const {
419428 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+ }
424441 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
425442 case SILDynamicCastKind::UnconditionalCheckedCastInst:
426443 return false ;
427444 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
428445 llvm_unreachable (" unsupported" );
429446 }
430447 }
448+
449+ bool canUseScalarCheckedCastInstructions () const {
450+ return swift::canUseScalarCheckedCastInstructions (
451+ getModule (), getSourceType (), getTargetType ());
452+ }
431453};
432454
433455} // end namespace swift
0 commit comments