aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/IR/ConstantRangeTest.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2015-10-22 03:12:57 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2015-10-22 03:12:57 +0000
commit6ed053051df2f2aad21ef0cfd773a2e5bd7a8d85 (patch)
tree82535fd9a97b3d872de804adde2dae4a933366a4 /llvm/unittests/IR/ConstantRangeTest.cpp
parent769e7e2f7122dc29a4400b4d4acfde858ab9fa2c (diff)
downloadllvm-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.cpp52
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