@@ -483,7 +483,8 @@ emitTypeCheck(SILBasicBlock *FailedTypeCheckBB, SubstitutableType *ParamTy,
483483 {GenericMTVal, SpecializedMTVal});
484484
485485 auto *SuccessBB = Builder.getFunction ().createBasicBlock ();
486- Builder.createCondBranch (Loc, Cmp, SuccessBB, FailedTypeCheckBB);
486+ auto *FailBB = createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
487+ Builder.createCondBranch (Loc, Cmp, SuccessBB, FailBB);
487488 Builder.emitBlock (SuccessBB);
488489}
489490
@@ -510,7 +511,8 @@ void EagerDispatch::emitIsTrivialCheck(SILBasicBlock *FailedTypeCheckBB,
510511 auto IsPOD = Builder.createBuiltin (Loc, Ctx.getIdentifier (" ispod" ), BoolTy,
511512 SubMap, {GenericMT});
512513 auto *SuccessBB = Builder.getFunction ().createBasicBlock ();
513- Builder.createCondBranch (Loc, IsPOD, SuccessBB, FailedTypeCheckBB);
514+ auto *FailBB = createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
515+ Builder.createCondBranch (Loc, IsPOD, SuccessBB, FailBB);
514516 Builder.emitBlock (SuccessBB);
515517}
516518
@@ -542,14 +544,16 @@ void EagerDispatch::emitTrivialAndSizeCheck(SILBasicBlock *FailedTypeCheckBB,
542544 {ParamSize, LayoutSize});
543545
544546 auto *SuccessBB1 = Builder.getFunction ().createBasicBlock ();
545- Builder.createCondBranch (Loc, Cmp, SuccessBB1, FailedTypeCheckBB);
547+ auto *FailBB1 = createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
548+ Builder.createCondBranch (Loc, Cmp, SuccessBB1, FailBB1);
546549 Builder.emitBlock (SuccessBB1);
547550 // Emit a check that it is a pod object.
548551 // TODO: Perform this check before all the fixed size checks!
549552 auto IsPOD = Builder.createBuiltin (Loc, Ctx.getIdentifier (" ispod" ),
550553 BoolTy, SubMap, { GenericMT });
551554 auto *SuccessBB2 = Builder.getFunction ().createBasicBlock ();
552- Builder.createCondBranch (Loc, IsPOD, SuccessBB2, FailedTypeCheckBB);
555+ auto *FailBB2 = createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
556+ Builder.createCondBranch (Loc, IsPOD, SuccessBB2, FailBB2);
553557 Builder.emitBlock (SuccessBB2);
554558}
555559
@@ -580,11 +584,11 @@ void EagerDispatch::emitRefCountedObjectCheck(SILBasicBlock *FailedTypeCheckBB,
580584 {CanBeClass, ClassConst});
581585
582586 auto *SuccessBB = Builder.getFunction ().createBasicBlock ();
583- auto *MayBeCallsCheckBB = Builder.getFunction ().createBasicBlock ();
584- Builder. createCondBranch (Loc, Cmp1, SuccessBB,
585- MayBeCallsCheckBB );
587+ auto *MayBeClassCheckBB = Builder.getFunction ().createBasicBlock ();
588+ auto *SwiftClassBB = createSplitBranchTarget (SuccessBB, Builder, Loc);
589+ Builder. createCondBranch (Loc, Cmp1, SwiftClassBB, MayBeClassCheckBB );
586590
587- Builder.emitBlock (MayBeCallsCheckBB );
591+ Builder.emitBlock (MayBeClassCheckBB );
588592
589593 auto MayBeClassConst =
590594 Builder.createIntegerLiteral (Loc, Int8Ty, 2 );
@@ -594,8 +598,9 @@ void EagerDispatch::emitRefCountedObjectCheck(SILBasicBlock *FailedTypeCheckBB,
594598 {CanBeClass, MayBeClassConst});
595599
596600 auto *IsClassCheckBB = Builder.getFunction ().createBasicBlock ();
597- Builder.createCondBranch (Loc, Cmp2, IsClassCheckBB,
598- FailedTypeCheckBB);
601+ auto *FailClassCheckBB =
602+ createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
603+ Builder.createCondBranch (Loc, Cmp2, IsClassCheckBB, FailClassCheckBB);
599604
600605 Builder.emitBlock (IsClassCheckBB);
601606
@@ -610,7 +615,9 @@ void EagerDispatch::emitRefCountedObjectCheck(SILBasicBlock *FailedTypeCheckBB,
610615 auto Member = Members[0 ];
611616 auto BoolValue =
612617 Builder.emitStructExtract (Loc, IsClassRuntimeCheck, Member, BoolTy);
613- Builder.createCondBranch (Loc, BoolValue, SuccessBB, FailedTypeCheckBB);
618+ auto *FailBB = createSplitBranchTarget (FailedTypeCheckBB, Builder, Loc);
619+ auto *ObjCOrExistentialBB = createSplitBranchTarget (SuccessBB, Builder, Loc);
620+ Builder.createCondBranch (Loc, BoolValue, ObjCOrExistentialBB, FailBB);
614621
615622 Builder.emitBlock (SuccessBB);
616623}
0 commit comments