mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 01:24:30 +00:00
[ConstantRange] Split makeICmpRegion in two.
Summary: This change splits `makeICmpRegion` into `makeAllowedICmpRegion` and `makeSatisfyingICmpRegion` with slightly different contracts. The first one is useful for determining what values some expression //may// take, given that a certain `icmp` evaluates to true. The second one is useful for determining what values are guaranteed to //satisfy// a given `icmp`. Reviewers: nlewycky Reviewed By: nlewycky Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D8345 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232575 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -49,14 +49,15 @@ ConstantRange::ConstantRange(APIntMoveTy L, APIntMoveTy U)
|
||||
"Lower == Upper, but they aren't min or max value!");
|
||||
}
|
||||
|
||||
ConstantRange ConstantRange::makeICmpRegion(unsigned Pred,
|
||||
const ConstantRange &CR) {
|
||||
ConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,
|
||||
const ConstantRange &CR) {
|
||||
if (CR.isEmptySet())
|
||||
return CR;
|
||||
|
||||
uint32_t W = CR.getBitWidth();
|
||||
switch (Pred) {
|
||||
default: llvm_unreachable("Invalid ICmp predicate to makeICmpRegion()");
|
||||
default:
|
||||
llvm_unreachable("Invalid ICmp predicate to makeAllowedICmpRegion()");
|
||||
case CmpInst::ICMP_EQ:
|
||||
return CR;
|
||||
case CmpInst::ICMP_NE:
|
||||
@ -114,6 +115,16 @@ ConstantRange ConstantRange::makeICmpRegion(unsigned Pred,
|
||||
}
|
||||
}
|
||||
|
||||
ConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,
|
||||
const ConstantRange &CR) {
|
||||
// Follows from De-Morgan's laws:
|
||||
//
|
||||
// ~(~A union ~B) == A intersect B.
|
||||
//
|
||||
return makeAllowedICmpRegion(CmpInst::getInversePredicate(Pred), CR)
|
||||
.inverse();
|
||||
}
|
||||
|
||||
/// isFullSet - Return true if this set contains all of the elements possible
|
||||
/// for this data-type
|
||||
bool ConstantRange::isFullSet() const {
|
||||
|
Reference in New Issue
Block a user