forked from OSchip/llvm-project
[ConstantRange] Add an getEquivalentICmp helper
Currently only its unit test uses it, but this will be used in a later change to simplify some logic in the GuardWidening pass. llvm-svn: 270018
This commit is contained in:
parent
41133a3e96
commit
590614c1e1
|
@ -114,6 +114,11 @@ public:
|
||||||
const ConstantRange &Other,
|
const ConstantRange &Other,
|
||||||
unsigned NoWrapKind);
|
unsigned NoWrapKind);
|
||||||
|
|
||||||
|
/// Set up \p Pred and \p RHS such that
|
||||||
|
/// ConstantRange::makeExactICmpRegion(Pred, RHS) == *this. Return true if
|
||||||
|
/// successful.
|
||||||
|
bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const;
|
||||||
|
|
||||||
/// Return the lower value for this range.
|
/// Return the lower value for this range.
|
||||||
///
|
///
|
||||||
const APInt &getLower() const { return Lower; }
|
const APInt &getLower() const { return Lower; }
|
||||||
|
|
|
@ -139,6 +139,32 @@ ConstantRange ConstantRange::makeExactICmpRegion(CmpInst::Predicate Pred,
|
||||||
return makeAllowedICmpRegion(Pred, C);
|
return makeAllowedICmpRegion(Pred, C);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,
|
||||||
|
APInt &RHS) const {
|
||||||
|
bool Success = false;
|
||||||
|
|
||||||
|
if (isFullSet() || isEmptySet()) {
|
||||||
|
Pred = isEmptySet() ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
|
||||||
|
RHS = APInt(getBitWidth(), 0);
|
||||||
|
Success = true;
|
||||||
|
} else if (getLower().isMinSignedValue() || getLower().isMinValue()) {
|
||||||
|
Pred =
|
||||||
|
getLower().isMinSignedValue() ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT;
|
||||||
|
RHS = getUpper();
|
||||||
|
Success = true;
|
||||||
|
} else if (getUpper().isMinSignedValue() || getUpper().isMinValue()) {
|
||||||
|
Pred =
|
||||||
|
getUpper().isMinSignedValue() ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE;
|
||||||
|
RHS = getLower();
|
||||||
|
Success = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert((!Success || ConstantRange::makeExactICmpRegion(Pred, RHS) == *this) &&
|
||||||
|
"Bad result!");
|
||||||
|
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
||||||
ConstantRange
|
ConstantRange
|
||||||
ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
|
ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
|
||||||
const ConstantRange &Other,
|
const ConstantRange &Other,
|
||||||
|
|
|
@ -716,4 +716,50 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
|
||||||
ConstantRange(APInt(32, 0), APInt(32, 1)));
|
ConstantRange(APInt(32, 0), APInt(32, 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ConstantRange, GetEquivalentICmp) {
|
||||||
|
APInt RHS;
|
||||||
|
CmpInst::Predicate Pred;
|
||||||
|
|
||||||
|
EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 100));
|
||||||
|
|
||||||
|
EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 100));
|
||||||
|
|
||||||
|
EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 100));
|
||||||
|
|
||||||
|
EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 100));
|
||||||
|
|
||||||
|
EXPECT_TRUE(
|
||||||
|
ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 0));
|
||||||
|
|
||||||
|
EXPECT_TRUE(
|
||||||
|
ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
|
||||||
|
EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
|
||||||
|
EXPECT_EQ(RHS, APInt(32, 0));
|
||||||
|
|
||||||
|
EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
|
||||||
|
EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
|
||||||
|
APInt::getSignedMinValue(32) + APInt(32, 100))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
|
||||||
|
EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
|
||||||
|
APInt::getMinValue(32) + APInt(32, 100))
|
||||||
|
.getEquivalentICmp(Pred, RHS));
|
||||||
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
Loading…
Reference in New Issue