BitTestInfo Cases;
BranchProbability Prob;
BranchProbability DefaultProb;
- bool OmitRangeCheck;
BitTestBlock(APInt F, APInt R, const Value *SV, unsigned Rg, MVT RgVT, bool E,
bool CR, MachineBasicBlock *P, MachineBasicBlock *D,
BitTestInfo C, BranchProbability Pr)
: First(std::move(F)), Range(std::move(R)), SValue(SV), Reg(Rg),
RegVT(RgVT), Emitted(E), ContiguousRange(CR), Parent(P), Default(D),
- Cases(std::move(C)), Prob(Pr), OmitRangeCheck(false) {}
+ Cases(std::move(C)), Prob(Pr) {}
};
/// Return the range of values within a range.
// Subtract the minimum value.
SDValue SwitchOp = getValue(B.SValue);
EVT VT = SwitchOp.getValueType();
- SDValue RangeSub =
- DAG.getNode(ISD::SUB, dl, VT, SwitchOp, DAG.getConstant(B.First, dl, VT));
+ SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, SwitchOp,
+ DAG.getConstant(B.First, dl, VT));
- // Determine the type of the test operands.
+ // Check range.
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+ SDValue RangeCmp = DAG.getSetCC(
+ dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
+ Sub.getValueType()),
+ Sub, DAG.getConstant(B.Range, dl, VT), ISD::SETUGT);
+
+ // Determine the type of the test operands.
bool UsePtrType = false;
if (!TLI.isTypeLegal(VT)) {
UsePtrType = true;
break;
}
}
- SDValue Sub = RangeSub;
if (UsePtrType) {
VT = TLI.getPointerTy(DAG.getDataLayout());
Sub = DAG.getZExtOrTrunc(Sub, dl, VT);
addSuccessorWithProb(SwitchBB, MBB, B.Prob);
SwitchBB->normalizeSuccProbs();
- SDValue Root = CopyTo;
- if (!B.OmitRangeCheck) {
- // Conditional branch to the default block.
- SDValue RangeCmp = DAG.getSetCC(dl,
- TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
- RangeSub.getValueType()),
- RangeSub, DAG.getConstant(B.Range, dl, RangeSub.getValueType()),
- ISD::SETUGT);
-
- Root = DAG.getNode(ISD::BRCOND, dl, MVT::Other, Root, RangeCmp,
- DAG.getBasicBlock(B.Default));
- }
+ SDValue BrRange = DAG.getNode(ISD::BRCOND, dl,
+ MVT::Other, CopyTo, RangeCmp,
+ DAG.getBasicBlock(B.Default));
// Avoid emitting unnecessary branches to the next block.
if (MBB != NextBlock(SwitchBB))
- Root = DAG.getNode(ISD::BR, dl, MVT::Other, Root, DAG.getBasicBlock(MBB));
+ BrRange = DAG.getNode(ISD::BR, dl, MVT::Other, BrRange,
+ DAG.getBasicBlock(MBB));
- DAG.setRoot(Root);
+ DAG.setRoot(BrRange);
}
/// visitBitTestCase - this function produces one "bit test"
break;
}
case CC_BitTests: {
+ // FIXME: If Fallthrough is unreachable, skip the range check.
+
// FIXME: Optimize away range check based on pivot comparisons.
BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
BTB->DefaultProb -= DefaultProb / 2;
}
- if (FallthroughUnreachable) {
- // Skip the range check if the fallthrough block is unreachable.
- BTB->OmitRangeCheck = true;
- }
-
// If we're in the right place, emit the bit test header right now.
if (CurMBB == SwitchMBB) {
visitBitTestHeader(*BTB, SwitchMBB);