diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-22 03:12:57 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-22 03:12:57 +0000 |
| commit | 6ed053051df2f2aad21ef0cfd773a2e5bd7a8d85 (patch) | |
| tree | 82535fd9a97b3d872de804adde2dae4a933366a4 /llvm/unittests/IR/ConstantRangeTest.cpp | |
| parent | 769e7e2f7122dc29a4400b4d4acfde858ab9fa2c (diff) | |
| download | llvm-6ed053051df2f2aad21ef0cfd773a2e5bd7a8d85.zip llvm-6ed053051df2f2aad21ef0cfd773a2e5bd7a8d85.tar.gz llvm-6ed053051df2f2aad21ef0cfd773a2e5bd7a8d85.tar.bz2 | |
[IR] Add a `makeNoWrapRegion` method to `ConstantRange`
Summary: This will be used in a future change to ScalarEvolution.
Reviewers: hfinkel, reames, nlewycky
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D13612
llvm-svn: 250975
Diffstat (limited to 'llvm/unittests/IR/ConstantRangeTest.cpp')
| -rw-r--r-- | llvm/unittests/IR/ConstantRangeTest.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp index de4eec4a..1f32eea 100644 --- a/llvm/unittests/IR/ConstantRangeTest.cpp +++ b/llvm/unittests/IR/ConstantRangeTest.cpp @@ -9,6 +9,7 @@ #include "llvm/IR/ConstantRange.h" #include "llvm/IR/Instructions.h" +#include "llvm/IR/Operator.h" #include "gtest/gtest.h" using namespace llvm; @@ -568,4 +569,55 @@ TEST(ConstantRange, MakeSatisfyingICmpRegion) { ConstantRange(APInt(8, 4), APInt(8, -128))); } +TEST(ConstantRange, MakeOverflowingRegion) { + const int IntMin4Bits = 8; + const int IntMax4Bits = 7; + typedef OverflowingBinaryOperator OBO; + + for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) { + APInt C(4, Const, true /* = isSigned */); + + auto NUWRegion = + ConstantRange::makeNoWrapRegion(Instruction::Add, C, OBO::NoUnsignedWrap); + + EXPECT_FALSE(NUWRegion.isEmptySet()); + + auto NSWRegion = + ConstantRange::makeNoWrapRegion(Instruction::Add, C, OBO::NoSignedWrap); + + EXPECT_FALSE(NSWRegion.isEmptySet()); + + auto NoWrapRegion = ConstantRange::makeNoWrapRegion( + Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap); + + EXPECT_FALSE(NoWrapRegion.isEmptySet()); + EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion)); + + for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + I.uadd_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + + for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + I.sadd_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + + for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E; + ++I) { + bool Overflow = false; + + I.sadd_ov(C, Overflow); + EXPECT_FALSE(Overflow); + + I.uadd_ov(C, Overflow); + EXPECT_FALSE(Overflow); + } + } +} + } // anonymous namespace |
