@@ -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);
@@ -2660,16 +2655,24 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,
2660
2655
addSuccessorWithProb (SwitchBB, MBB, B.Prob );
2661
2656
SwitchBB->normalizeSuccProbs ();
2662
2657
2663
- SDValue BrRange = DAG.getNode (ISD::BRCOND, dl,
2664
- MVT::Other, CopyTo, RangeCmp,
2665
- DAG.getBasicBlock (B.Default ));
2658
+ SDValue Root = CopyTo;
2659
+ if (!B.OmitRangeCheck ) {
2660
+ // Conditional branch to the default block.
2661
+ SDValue RangeCmp = DAG.getSetCC (dl,
2662
+ TLI.getSetCCResultType (DAG.getDataLayout (), *DAG.getContext (),
2663
+ RangeSub.getValueType ()),
2664
+ RangeSub, DAG.getConstant (B.Range , dl, RangeSub.getValueType ()),
2665
+ ISD::SETUGT);
2666
+
2667
+ Root = DAG.getNode (ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
2668
+ DAG.getBasicBlock (B.Default ));
2669
+ }
2666
2670
2667
2671
// Avoid emitting unnecessary branches to the next block.
2668
2672
if (MBB != NextBlock (SwitchBB))
2669
- BrRange = DAG.getNode (ISD::BR, dl, MVT::Other, BrRange,
2670
- DAG.getBasicBlock (MBB));
2673
+ Root = DAG.getNode (ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock (MBB));
2671
2674
2672
- DAG.setRoot (BrRange );
2675
+ DAG.setRoot (Root );
2673
2676
}
2674
2677
2675
2678
// / visitBitTestCase - this function produces one "bit test"
@@ -10164,8 +10167,6 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
10164
10167
break ;
10165
10168
}
10166
10169
case CC_BitTests: {
10167
- // FIXME: If Fallthrough is unreachable, skip the range check.
10168
-
10169
10170
// FIXME: Optimize away range check based on pivot comparisons.
10170
10171
BitTestBlock *BTB = &SL->BitTestCases [I->BTCasesIndex ];
10171
10172
@@ -10186,6 +10187,11 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
10186
10187
BTB->DefaultProb -= DefaultProb / 2 ;
10187
10188
}
10188
10189
10190
+ if (FallthroughUnreachable) {
10191
+ // Skip the range check if the fallthrough block is unreachable.
10192
+ BTB->OmitRangeCheck = true ;
10193
+ }
10194
+
10189
10195
// If we're in the right place, emit the bit test header right now.
10190
10196
if (CurMBB == SwitchMBB) {
10191
10197
visitBitTestHeader (*BTB, SwitchMBB);
0 commit comments