#include "llvm/IR/ConstantRange.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Operator.h"
#include "llvm/Support/KnownBits.h"
#include "gtest/gtest.h"
usingnamespacellvm;
namespace {
class ConstantRangeTest : public ::testing::Test { … };
template<typename Fn>
static void EnumerateAPInts(unsigned Bits, Fn TestFn) { … }
template<typename Fn>
static void EnumerateConstantRanges(unsigned Bits, Fn TestFn) { … }
template <typename Fn>
static void EnumerateInterestingConstantRanges(Fn TestFn) { … }
template <typename Fn>
static void EnumerateTwoInterestingConstantRanges(Fn TestFn) { … }
template <typename Fn>
static void ForeachNumInConstantRange(const ConstantRange &CR, Fn TestFn) { … }
PreferFn;
bool PreferSmallest(const ConstantRange &CR1, const ConstantRange &CR2) { … }
bool PreferSmallestUnsigned(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
bool PreferSmallestSigned(const ConstantRange &CR1, const ConstantRange &CR2) { … }
bool PreferSmallestNonFullUnsigned(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
bool PreferSmallestNonFullSigned(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
testing::AssertionResult rangeContains(const ConstantRange &CR, const APInt &N,
ArrayRef<ConstantRange> Inputs) { … }
static void TestRange(const ConstantRange &CR, const SmallBitVector &Elems,
PreferFn PreferenceFn, ArrayRef<ConstantRange> Inputs,
bool CheckOptimality = true) { … }
UnaryRangeFn;
UnaryIntFn;
static void TestUnaryOpExhaustive(UnaryRangeFn RangeFn, UnaryIntFn IntFn,
PreferFn PreferenceFn = PreferSmallest) { … }
BinaryRangeFn;
BinaryIntFn;
BinaryCheckFn;
static bool CheckAll(const ConstantRange &, const ConstantRange &) { … }
static bool CheckCorrectnessOnly(const ConstantRange &, const ConstantRange &) { … }
static bool CheckSingleElementsOnly(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
static bool CheckNonWrappedOnly(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
static bool CheckNonSignWrappedOnly(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
static bool
CheckNoSignedWrappedLHSAndNoWrappedRHSOnly(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
static bool CheckNonWrappedOrSignWrappedOnly(const ConstantRange &CR1,
const ConstantRange &CR2) { … }
static void TestBinaryOpExhaustive(BinaryRangeFn RangeFn, BinaryIntFn IntFn,
PreferFn PreferenceFn = PreferSmallest,
BinaryCheckFn CheckFn = CheckAll) { … }
ConstantRange ConstantRangeTest::Full(16, true);
ConstantRange ConstantRangeTest::Empty(16, false);
ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
TEST_F(ConstantRangeTest, Basics) { … }
TEST_F(ConstantRangeTest, Equality) { … }
TEST_F(ConstantRangeTest, SingleElement) { … }
TEST_F(ConstantRangeTest, GetMinsAndMaxes) { … }
TEST_F(ConstantRangeTest, SignWrapped) { … }
TEST_F(ConstantRangeTest, UpperWrapped) { … }
TEST_F(ConstantRangeTest, Trunc) { … }
TEST_F(ConstantRangeTest, ZExt) { … }
TEST_F(ConstantRangeTest, SExt) { … }
TEST_F(ConstantRangeTest, IntersectWith) { … }
template <typename Fn1, typename Fn2, typename Fn3>
void testBinarySetOperationExhaustive(Fn1 OpFn, Fn2 ExactOpFn, Fn3 InResultFn) { … }
TEST_F(ConstantRangeTest, IntersectWithExhaustive) { … }
TEST_F(ConstantRangeTest, UnionWithExhaustive) { … }
TEST_F(ConstantRangeTest, UnionWith) { … }
TEST_F(ConstantRangeTest, SetDifference) { … }
TEST_F(ConstantRangeTest, getActiveBits) { … }
TEST_F(ConstantRangeTest, losslessUnsignedTruncationZeroext) { … }
TEST_F(ConstantRangeTest, getMinSignedBits) { … }
TEST_F(ConstantRangeTest, losslessSignedTruncationSignext) { … }
TEST_F(ConstantRangeTest, SubtractAPInt) { … }
TEST_F(ConstantRangeTest, Add) { … }
TEST_F(ConstantRangeTest, AddWithNoWrap) { … }
TEST_F(ConstantRangeTest, Sub) { … }
TEST_F(ConstantRangeTest, SubWithNoWrap) { … }
TEST_F(ConstantRangeTest, Multiply) { … }
TEST_F(ConstantRangeTest, MultiplyWithNoWrap) { … }
TEST_F(ConstantRangeTest, smul_fast) { … }
TEST_F(ConstantRangeTest, UMax) { … }
TEST_F(ConstantRangeTest, SMax) { … }
TEST_F(ConstantRangeTest, UMin) { … }
TEST_F(ConstantRangeTest, SMin) { … }
TEST_F(ConstantRangeTest, UDiv) { … }
TEST_F(ConstantRangeTest, SDiv) { … }
TEST_F(ConstantRangeTest, URem) { … }
TEST_F(ConstantRangeTest, SRem) { … }
TEST_F(ConstantRangeTest, Shl) { … }
TEST_F(ConstantRangeTest, ShlWithNoWrap) { … }
TEST_F(ConstantRangeTest, Lshr) { … }
TEST_F(ConstantRangeTest, Ashr) { … }
TEST(ConstantRange, MakeAllowedICmpRegion) { … }
TEST(ConstantRange, MakeSatisfyingICmpRegion) { … }
void ICmpTestImpl(CmpInst::Predicate Pred) { … }
TEST(ConstantRange, ICmp) { … }
TEST(ConstantRange, MakeGuaranteedNoWrapRegion) { … }
template<typename Fn>
void TestNoWrapRegionExhaustive(Instruction::BinaryOps BinOp,
unsigned NoWrapKind, Fn OverflowFn) { … }
TEST(ConstantRange, NoWrapRegionExhaustive) { … }
TEST(ConstantRange, GetEquivalentICmp) { … }
#define EXPECT_MAY_OVERFLOW(op) …
#define EXPECT_ALWAYS_OVERFLOWS_LOW(op) …
#define EXPECT_ALWAYS_OVERFLOWS_HIGH(op) …
#define EXPECT_NEVER_OVERFLOWS(op) …
TEST_F(ConstantRangeTest, UnsignedAddOverflow) { … }
TEST_F(ConstantRangeTest, UnsignedSubOverflow) { … }
TEST_F(ConstantRangeTest, SignedAddOverflow) { … }
TEST_F(ConstantRangeTest, SignedSubOverflow) { … }
template <typename Fn1, typename Fn2>
static void TestOverflowExhaustive(Fn1 OverflowFn, Fn2 MayOverflowFn) { … }
TEST_F(ConstantRangeTest, UnsignedAddOverflowExhaustive) { … }
TEST_F(ConstantRangeTest, UnsignedSubOverflowExhaustive) { … }
TEST_F(ConstantRangeTest, UnsignedMulOverflowExhaustive) { … }
TEST_F(ConstantRangeTest, SignedAddOverflowExhaustive) { … }
TEST_F(ConstantRangeTest, SignedSubOverflowExhaustive) { … }
TEST_F(ConstantRangeTest, FromKnownBits) { … }
TEST_F(ConstantRangeTest, FromKnownBitsExhaustive) { … }
TEST_F(ConstantRangeTest, ToKnownBits) { … }
TEST_F(ConstantRangeTest, Negative) { … }
TEST_F(ConstantRangeTest, UAddSat) { … }
TEST_F(ConstantRangeTest, USubSat) { … }
TEST_F(ConstantRangeTest, UMulSat) { … }
TEST_F(ConstantRangeTest, UShlSat) { … }
TEST_F(ConstantRangeTest, SAddSat) { … }
TEST_F(ConstantRangeTest, SSubSat) { … }
TEST_F(ConstantRangeTest, SMulSat) { … }
TEST_F(ConstantRangeTest, SShlSat) { … }
TEST_F(ConstantRangeTest, Abs) { … }
TEST_F(ConstantRangeTest, Ctlz) { … }
TEST_F(ConstantRangeTest, Cttz) { … }
TEST_F(ConstantRangeTest, Ctpop) { … }
TEST_F(ConstantRangeTest, castOps) { … }
TEST_F(ConstantRangeTest, binaryAnd) { … }
TEST_F(ConstantRangeTest, binaryOr) { … }
TEST_F(ConstantRangeTest, binaryXor) { … }
TEST_F(ConstantRangeTest, binaryNot) { … }
template <typename T>
void testConstantRangeICmpPredEquivalence(ICmpInst::Predicate SrcPred, T Func) { … }
TEST_F(ConstantRangeTest, areInsensitiveToSignednessOfICmpPredicate) { … }
TEST_F(ConstantRangeTest, areInsensitiveToSignednessOfInvertedICmpPredicate) { … }
TEST_F(ConstantRangeTest, getEquivalentPredWithFlippedSignedness) { … }
TEST_F(ConstantRangeTest, isSizeLargerThan) { … }
TEST_F(ConstantRangeTest, MakeMaskNotEqualRange) { … }
TEST_F(ConstantRangeTest, MakeMaskNotEqualRangeExhaustive) { … }
}