@@ -2654,62 +2654,65 @@ void SILGenFunction::emitSwitchStmt(SwitchStmt *S) {
2654
2654
// statement.
2655
2655
JumpDest sharedDest = emission.getSharedCaseBlockDest (caseBlock);
2656
2656
Cleanups.emitBranchAndCleanups (sharedDest, caseBlock);
2657
- } else if (row.hasFallthroughTo () || caseBlock->getCaseLabelItems ().size () > 1 ) {
2658
- JumpDest sharedDest =
2659
- emission.getSharedCaseBlockDest (caseBlock);
2660
-
2661
- // Generate the arguments from this row's pattern in the case block's
2662
- // expected order, and keep those arguments from being cleaned up, as
2663
- // we're passing the +1 along to the shared case block dest. (The
2664
- // cleanups still happen, as they are threaded through here messily,
2665
- // but the explicit retains here counteract them, and then the
2666
- // retain/release pair gets optimized out.)
2667
- ArrayRef<CaseLabelItem> labelItems = caseBlock->getCaseLabelItems ();
2668
- SmallVector<SILValue, 4 > args;
2669
- SmallVector<VarDecl *, 4 > expectedVarOrder;
2670
- SmallVector<VarDecl *, 4 > vars;
2671
- labelItems[0 ].getPattern ()->collectVariables (expectedVarOrder);
2672
- row.getCasePattern ()->collectVariables (vars);
2673
-
2674
- SILModule &M = F.getModule ();
2675
- for (auto expected : expectedVarOrder) {
2676
- if (!expected->hasName ())
2657
+ return ;
2658
+ }
2659
+
2660
+ // If we don't have a fallthrough or a multi-pattern 'case', we can just
2661
+ // emit the body inline and save some dead blocks. Emit the statement here.
2662
+ if (!row.hasFallthroughTo () && caseBlock->getCaseLabelItems ().size () == 1 ) {
2663
+ emission.emitCaseBody (caseBlock);
2664
+ return ;
2665
+ }
2666
+
2667
+ JumpDest sharedDest = emission.getSharedCaseBlockDest (caseBlock);
2668
+
2669
+ // Generate the arguments from this row's pattern in the case block's
2670
+ // expected order, and keep those arguments from being cleaned up, as
2671
+ // we're passing the +1 along to the shared case block dest. (The
2672
+ // cleanups still happen, as they are threaded through here messily,
2673
+ // but the explicit retains here counteract them, and then the
2674
+ // retain/release pair gets optimized out.)
2675
+ ArrayRef<CaseLabelItem> labelItems = caseBlock->getCaseLabelItems ();
2676
+ SmallVector<SILValue, 4 > args;
2677
+ SmallVector<VarDecl *, 4 > expectedVarOrder;
2678
+ SmallVector<VarDecl *, 4 > vars;
2679
+ labelItems[0 ].getPattern ()->collectVariables (expectedVarOrder);
2680
+ row.getCasePattern ()->collectVariables (vars);
2681
+
2682
+ SILModule &M = F.getModule ();
2683
+ for (auto expected : expectedVarOrder) {
2684
+ if (!expected->hasName ())
2685
+ continue ;
2686
+ for (auto *var : vars) {
2687
+ if (!var->hasName () || var->getName () != expected->getName ())
2677
2688
continue ;
2678
- for (auto *var : vars) {
2679
- if (var->hasName () && var->getName () == expected->getName ()) {
2680
- SILValue value = VarLocs[var].value ;
2681
- SILType type = value->getType ();
2682
-
2683
- // If we have an address-only type, initialize the temporary
2684
- // allocation. We're not going to pass the address as a block
2685
- // argument.
2686
- if (type.isAddressOnly (M)) {
2687
- emission.emitAddressOnlyInitialization (expected, value);
2688
- break ;
2689
- }
2690
2689
2691
- // If we have a loadable address, perform a load [copy].
2692
- if (type.isAddress ()) {
2693
- value = B.emitLoadValueOperation (CurrentSILLoc, value,
2694
- LoadOwnershipQualifier::Copy);
2695
- args.push_back (value);
2696
- break ;
2697
- }
2690
+ SILValue value = VarLocs[var].value ;
2691
+ SILType type = value->getType ();
2698
2692
2699
- value = B.emitCopyValueOperation (CurrentSILLoc, value);
2700
- args.push_back (value);
2701
- break ;
2702
- }
2693
+ // If we have an address-only type, initialize the temporary
2694
+ // allocation. We're not going to pass the address as a block
2695
+ // argument.
2696
+ if (type.isAddressOnly (M)) {
2697
+ emission.emitAddressOnlyInitialization (expected, value);
2698
+ break ;
2703
2699
}
2704
- }
2705
2700
2706
- Cleanups.emitBranchAndCleanups (sharedDest, caseBlock, args);
2707
- } else {
2708
- // However, if we don't have a fallthrough or a multi-pattern 'case', we
2709
- // can just emit the body inline and save some dead blocks.
2710
- // Emit the statement here.
2711
- emission.emitCaseBody (caseBlock);
2701
+ // If we have a loadable address, perform a load [copy].
2702
+ if (type.isAddress ()) {
2703
+ value = B.emitLoadValueOperation (CurrentSILLoc, value,
2704
+ LoadOwnershipQualifier::Copy);
2705
+ args.push_back (value);
2706
+ break ;
2707
+ }
2708
+
2709
+ value = B.emitCopyValueOperation (CurrentSILLoc, value);
2710
+ args.push_back (value);
2711
+ break ;
2712
+ }
2712
2713
}
2714
+
2715
+ Cleanups.emitBranchAndCleanups (sharedDest, caseBlock, args);
2713
2716
};
2714
2717
2715
2718
PatternMatchEmission emission (*this , S, completionHandler);
0 commit comments