aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/IR/ConstantRangeTest.cpp
diff options
context:
space:
mode:
authorAlexander Shaposhnikov <ashaposhnikov@google.com>2022-05-17 21:30:44 +0000
committerAlexander Shaposhnikov <ashaposhnikov@google.com>2022-05-17 22:06:03 +0000
commit0f4d9f9b71be8a95cd24534bf914fc9a6fb0ff30 (patch)
tree51524f0afeaeecc61e3c99ef2a4767a91d5a9bcc /llvm/unittests/IR/ConstantRangeTest.cpp
parentc907d6e0e9fd8fafd49e4d0f9e584f58bbac5ead (diff)
downloadllvm-0f4d9f9b71be8a95cd24534bf914fc9a6fb0ff30.zip
llvm-0f4d9f9b71be8a95cd24534bf914fc9a6fb0ff30.tar.gz
llvm-0f4d9f9b71be8a95cd24534bf914fc9a6fb0ff30.tar.bz2
[ConstantRange] Improve the implementation of binaryAnd
This diff adjusts binaryAnd to take advantage of the analysis based on KnownBits. Differential revision: https://reviews.llvm.org/D125603 Test plan: 1/ ninja check-llvm 2/ ninja check-llvm-unit
Diffstat (limited to 'llvm/unittests/IR/ConstantRangeTest.cpp')
-rw-r--r--llvm/unittests/IR/ConstantRangeTest.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp
index 02f8b46..ffd0f00 100644
--- a/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/llvm/unittests/IR/ConstantRangeTest.cpp
@@ -2528,6 +2528,38 @@ TEST_F(ConstantRangeTest, castOps) {
EXPECT_TRUE(IntToPtr.isFullSet());
}
+TEST_F(ConstantRangeTest, binaryAnd) {
+ // Single element ranges.
+ ConstantRange R16(APInt(8, 16));
+ ConstantRange R20(APInt(8, 20));
+ EXPECT_EQ(*R16.binaryAnd(R16).getSingleElement(), APInt(8, 16));
+ EXPECT_EQ(*R16.binaryAnd(R20).getSingleElement(), APInt(8, 16 & 20));
+
+ ConstantRange R16_32(APInt(8, 16), APInt(8, 32));
+ // 'And' with a high bits mask.
+ ConstantRange R32(APInt(8, 32));
+ EXPECT_TRUE(R16_32.binaryAnd(R32).getSingleElement()->isZero());
+ EXPECT_TRUE(R32.binaryAnd(R16_32).getSingleElement()->isZero());
+ // 'And' with a low bits mask. Handled conservatively for now.
+ ConstantRange R4(APInt(8, 4));
+ ConstantRange R0_5(APInt(8, 0), APInt(8, 5));
+ EXPECT_EQ(R16_32.binaryAnd(R4), R0_5);
+ EXPECT_EQ(R4.binaryAnd(R16_32), R0_5);
+
+ // Ranges with more than one element. Handled conservatively for now.
+ ConstantRange R0_99(APInt(8, 0), APInt(8, 99));
+ ConstantRange R0_32(APInt(8, 0), APInt(8, 32));
+ EXPECT_EQ(R16_32.binaryAnd(R0_99), R0_32);
+ EXPECT_EQ(R0_99.binaryAnd(R16_32), R0_32);
+
+ TestBinaryOpExhaustive(
+ [](const ConstantRange &CR1, const ConstantRange &CR2) {
+ return CR1.binaryAnd(CR2);
+ },
+ [](const APInt &N1, const APInt &N2) { return N1 & N2; }, PreferSmallest,
+ CheckSingleElementsOnly);
+}
+
TEST_F(ConstantRangeTest, binaryXor) {
// Single element ranges.
ConstantRange R16(APInt(8, 16));