Revert "[ConstantRange] Improve the implementation of binaryOr"
authorDouglas Yung <douglas.yung@sony.com>
Fri, 20 May 2022 17:21:24 +0000 (10:21 -0700)
committerDouglas Yung <douglas.yung@sony.com>
Fri, 20 May 2022 17:24:20 +0000 (10:24 -0700)
This reverts commit 6990e7477d24ff585ae86549f5280f0be65422a6.

This change was causing the test compiler-rt/test/fuzzer/merge_two_step.test to fail on
our internal bot as well as other build bots such as https://lab.llvm.org/buildbot/#/builders/179/builds/3712.

llvm/lib/IR/ConstantRange.cpp
llvm/unittests/IR/ConstantRangeTest.cpp

index be6386c..c3915ce 100644 (file)
@@ -1410,13 +1410,14 @@ ConstantRange ConstantRange::binaryOr(const ConstantRange &Other) const {
   if (isEmptySet() || Other.isEmptySet())
     return getEmpty();
 
-  ConstantRange KnownBitsRange =
-      fromKnownBits(toKnownBits() | Other.toKnownBits(), false);
-  // Upper wrapped range.
-  ConstantRange UMaxUMinRange =
-      getNonEmpty(APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin()),
-                  APInt::getZero(getBitWidth()));
-  return KnownBitsRange.intersectWith(UMaxUMinRange);
+  // Use APInt's implementation of OR for single element ranges.
+  if (isSingleElement() && Other.isSingleElement())
+    return {*getSingleElement() | *Other.getSingleElement()};
+
+  // TODO: replace this with something less conservative
+
+  APInt umax = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
+  return getNonEmpty(std::move(umax), APInt::getZero(getBitWidth()));
 }
 
 ConstantRange ConstantRange::binaryXor(const ConstantRange &Other) const {
index 8a543b1..ffd0f00 100644 (file)
@@ -2560,44 +2560,6 @@ TEST_F(ConstantRangeTest, binaryAnd) {
       CheckSingleElementsOnly);
 }
 
-TEST_F(ConstantRangeTest, binaryOr) {
-  // Single element ranges.
-  ConstantRange R16(APInt(8, 16));
-  ConstantRange R20(APInt(8, 20));
-  EXPECT_EQ(*R16.binaryOr(R16).getSingleElement(), APInt(8, 16));
-  EXPECT_EQ(*R16.binaryOr(R20).getSingleElement(), APInt(8, 16 | 20));
-
-  ConstantRange R16_32(APInt(8, 16), APInt(8, 32));
-  // 'Or' with a high bits mask.
-  // KnownBits estimate is important, otherwise the maximum included element
-  // would be 2^8 - 1.
-  ConstantRange R32(APInt(8, 32));
-  ConstantRange R48_64(APInt(8, 48), APInt(8, 64));
-  EXPECT_EQ(R16_32.binaryOr(R32), R48_64);
-  EXPECT_EQ(R32.binaryOr(R16_32), R48_64);
-  // 'Or' with a low bits mask.
-  ConstantRange R4(APInt(8, 4));
-  ConstantRange R0_16(APInt(8, 0), APInt(8, 16));
-  ConstantRange R4_16(APInt(8, 4), APInt(8, 16));
-  EXPECT_EQ(R0_16.binaryOr(R4), R4_16);
-  EXPECT_EQ(R4.binaryOr(R0_16), R4_16);
-
-  // Ranges with more than one element. Handled conservatively for now.
-  // UMaxUMin estimate is important, otherwise the lower bound would be zero.
-  ConstantRange R0_64(APInt(8, 0), APInt(8, 64));
-  ConstantRange R5_32(APInt(8, 5), APInt(8, 32));
-  ConstantRange R5_64(APInt(8, 5), APInt(8, 64));
-  EXPECT_EQ(R0_64.binaryOr(R5_32), R5_64);
-  EXPECT_EQ(R5_32.binaryOr(R0_64), R5_64);
-
-  TestBinaryOpExhaustive(
-      [](const ConstantRange &CR1, const ConstantRange &CR2) {
-        return CR1.binaryOr(CR2);
-      },
-      [](const APInt &N1, const APInt &N2) { return N1 | N2; }, PreferSmallest,
-      CheckSingleElementsOnly);
-}
-
 TEST_F(ConstantRangeTest, binaryXor) {
   // Single element ranges.
   ConstantRange R16(APInt(8, 16));