[llvm] 2db4dc7 - [ConstantRange] Implement binaryXor() using known bits
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue May 17 01:05:20 PDT 2022
Author: Nikita Popov
Date: 2022-05-17T10:05:12+02:00
New Revision: 2db4dc7ec0595dae4b2fb5499da698eb117e2dc7
URL: https://github.com/llvm/llvm-project/commit/2db4dc7ec0595dae4b2fb5499da698eb117e2dc7
DIFF: https://github.com/llvm/llvm-project/commit/2db4dc7ec0595dae4b2fb5499da698eb117e2dc7.diff
LOG: [ConstantRange] Implement binaryXor() using known bits
This allows us to compute known high bits. It's not optimal, but
better than nothing.
Added:
Modified:
llvm/lib/IR/ConstantRange.cpp
llvm/unittests/IR/ConstantRangeTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp
index 16eb4d0a8dca2..ce2e537722346 100644
--- a/llvm/lib/IR/ConstantRange.cpp
+++ b/llvm/lib/IR/ConstantRange.cpp
@@ -1430,8 +1430,7 @@ ConstantRange ConstantRange::binaryXor(const ConstantRange &Other) const {
if (isSingleElement() && getSingleElement()->isAllOnes())
return Other.binaryNot();
- // TODO: replace this with something less conservative
- return getFull();
+ return fromKnownBits(toKnownBits() ^ Other.toKnownBits(), /*IsSigned*/false);
}
ConstantRange
diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp
index b230a21aecd98..02f8b46fc9270 100644
--- a/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/llvm/unittests/IR/ConstantRangeTest.cpp
@@ -2535,12 +2535,22 @@ TEST_F(ConstantRangeTest, binaryXor) {
EXPECT_EQ(*R16.binaryXor(R16).getSingleElement(), APInt(8, 0));
EXPECT_EQ(*R16.binaryXor(R20).getSingleElement(), APInt(8, 16 ^ 20));
- // Ranges with more than a single element. Handled conservatively for now.
+ // Ranges with more than a single element.
ConstantRange R16_35(APInt(8, 16), APInt(8, 35));
ConstantRange R0_99(APInt(8, 0), APInt(8, 99));
- EXPECT_TRUE(R16_35.binaryXor(R16_35).isFullSet());
- EXPECT_TRUE(R16_35.binaryXor(R0_99).isFullSet());
- EXPECT_TRUE(R0_99.binaryXor(R16_35).isFullSet());
+ EXPECT_EQ(R16_35.binaryXor(R16_35), ConstantRange(APInt(8, 0), APInt(8, 64)));
+ EXPECT_EQ(R16_35.binaryXor(R0_99), ConstantRange(APInt(8, 0), APInt(8, 128)));
+ EXPECT_EQ(R0_99.binaryXor(R16_35), ConstantRange(APInt(8, 0), APInt(8, 128)));
+
+ TestBinaryOpExhaustive(
+ [](const ConstantRange &CR1, const ConstantRange &CR2) {
+ return CR1.binaryXor(CR2);
+ },
+ [](const APInt &N1, const APInt &N2) {
+ return N1 ^ N2;
+ },
+ PreferSmallest,
+ CheckSingleElementsOnly);
}
TEST_F(ConstantRangeTest, binaryNot) {
More information about the llvm-commits
mailing list