@@ -2622,17 +2622,11 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
2622
2622
// Subtract the minimum value.
2623
2623
SDValue SwitchOp = getValue (B.SValue );
2624
2624
EVT VT = SwitchOp.getValueType ();
2625
- SDValue Sub = DAG.getNode (ISD::SUB, dl, VT, SwitchOp,
2626
- DAG.getConstant (B.First , dl, VT));
2627
-
2628
- // Check range.
2629
- const TargetLowering &TLI = DAG.getTargetLoweringInfo ();
2630
- SDValue RangeCmp = DAG.getSetCC (
2631
- dl, TLI.getSetCCResultType (DAG.getDataLayout (), *DAG.getContext (),
2632
- Sub.getValueType ()),
2633
- Sub, DAG.getConstant (B.Range , dl, VT), ISD::SETUGT);
2625
+ SDValue RangeSub =
2626
+ DAG.getNode (ISD::SUB, dl, VT, SwitchOp, DAG.getConstant (B.First , dl, VT));
2634
2627
2635
2628
// Determine the type of the test operands.
2629
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo ();
2636
2630
bool UsePtrType = false ;
2637
2631
if (!TLI.isTypeLegal (VT)) {
2638
2632
UsePtrType = true ;
@@ -2645,6 +2639,7 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
2645
2639
break ;
2646
2640
}
2647
2641
}
2642
+ SDValue Sub = RangeSub;
2648
2643
if (UsePtrType) {
2649
2644
VT = TLI.getPointerTy (DAG.getDataLayout ());
2650
2645
Sub = DAG.getZExtOrTrunc (Sub, dl, VT);
@@ -2656,20 +2651,29 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
2656
2651
2657
2652
MachineBasicBlock* MBB = B.Cases [0 ].ThisBB ;
2658
2653
2659
- addSuccessorWithProb (SwitchBB, B.Default , B.DefaultProb );
2654
+ if (!B.OmitRangeCheck )
2655
+ addSuccessorWithProb (SwitchBB, B.Default , B.DefaultProb );
2660
2656
addSuccessorWithProb (SwitchBB, MBB, B.Prob );
2661
2657
SwitchBB->normalizeSuccProbs ();
2662
2658
2663
- SDValue BrRange = DAG.getNode (ISD::BRCOND, dl,
2664
- MVT::Other, CopyTo, RangeCmp,
2665
- DAG.getBasicBlock (B.Default ));
2659
+ SDValue Root = CopyTo;
2660
+ if (!B.OmitRangeCheck ) {
2661
+ // Conditional branch to the default block.
2662
+ SDValue RangeCmp = DAG.getSetCC (dl,
2663
+ TLI.getSetCCResultType (DAG.getDataLayout (), *DAG.getContext (),
2664
+ RangeSub.getValueType ()),
2665
+ RangeSub, DAG.getConstant (B.Range , dl, RangeSub.getValueType ()),
2666
+ ISD::SETUGT);
2667
+
2668
+ Root = DAG.getNode (ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
2669
+ DAG.getBasicBlock (B.Default ));
2670
+ }
2666
2671
2667
2672
// Avoid emitting unnecessary branches to the next block.
2668
2673
if (MBB != NextBlock (SwitchBB))
2669
- BrRange = DAG.getNode (ISD::BR, dl, MVT::Other, BrRange,
2670
- DAG.getBasicBlock (MBB));
2674
+ Root = DAG.getNode (ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock (MBB));
2671
2675
2672
- DAG.setRoot (BrRange );
2676
+ DAG.setRoot (Root );
2673
2677
}
2674
2678
2675
2679
// / visitBitTestCase - this function produces one "bit test"
@@ -10164,8 +10168,6 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
10164
10168
break ;
10165
10169
}
10166
10170
case CC_BitTests: {
10167
- // FIXME: If Fallthrough is unreachable, skip the range check.
10168
-
10169
10171
// FIXME: Optimize away range check based on pivot comparisons.
10170
10172
BitTestBlock *BTB = &SL->BitTestCases [I->BTCasesIndex ];
10171
10173
@@ -10186,6 +10188,11 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
10186
10188
BTB->DefaultProb -= DefaultProb / 2 ;
10187
10189
}
10188
10190
10191
+ if (FallthroughUnreachable) {
10192
+ // Skip the range check if the fallthrough block is unreachable.
10193
+ BTB->OmitRangeCheck = true ;
10194
+ }
10195
+
10189
10196
// If we're in the right place, emit the bit test header right now.
10190
10197
if (CurMBB == SwitchMBB) {
10191
10198
visitBitTestHeader (*BTB, SwitchMBB);
0 commit comments