diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 50dd03f52b4..a83e207bd26 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -1140,52 +1140,14 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero, KnownZero = APInt::getHighBitsSet(BitWidth, LeadZ); break; } - case Instruction::Select: { + case Instruction::Select: computeKnownBits(I->getOperand(2), KnownZero, KnownOne, DL, Depth + 1, Q); computeKnownBits(I->getOperand(1), KnownZero2, KnownOne2, DL, Depth + 1, Q); // Only known if known in both the LHS and RHS. KnownOne &= KnownOne2; KnownZero &= KnownZero2; - - // There are several cmp+select patterns that ensure their result will be no - // greater than a constant. Detect a number of these. - Value *X, *Y; - ConstantInt *C1, *C2; - ICmpInst::Predicate Pred; - - auto IsLessThanOrEqualTo = [](Value *X, Value *Y) { - if (X == Y) - return true; - Value *M1, *M2; - ConstantInt *C1, *C2; - if (!match(X, m_NSWAdd(m_Value(M1), m_ConstantInt(C1)))) - C1 = nullptr; - if (!match(Y, m_NSWAdd(m_Value(M2), m_ConstantInt(C2)))) - C2 = nullptr; - if (C1 && M1 == Y && C1->isNegative()) - return true; - if (C2 && M2 == X && !C2->isNegative()) - return true; - if (C1 && C2 && M1 == M2 && !C1->isNegative() && !C2->isNegative() && - C1->getValue().ule(C2->getValue())) - return true; - return false; - }; - - // (select (icmp ugt X, C1), C2, Y) - // if Y <= X and C2 <= C1 - // then maximum value = C1. - if (match(I, m_Select(m_ICmp(Pred, m_Value(X), m_ConstantInt(C1)), - m_ConstantInt(C2), m_Value(Y)))) { - if (Pred == ICmpInst::ICMP_UGT && IsLessThanOrEqualTo(Y, X) && - C2->getValue().ule(C1->getValue())) { - auto V = cast(C1)->getValue() - 1; - KnownZero = ~APInt::getLowBitsSet(V.getBitWidth(), V.getActiveBits()); - } - } break; - } case Instruction::FPTrunc: case Instruction::FPExt: case Instruction::FPToUI: diff --git a/test/Analysis/ValueTracking/select-maxbits.ll b/test/Analysis/ValueTracking/select-maxbits.ll deleted file mode 100644 index 4b121745048..00000000000 --- a/test/Analysis/ValueTracking/select-maxbits.ll +++ /dev/null @@ -1,62 +0,0 @@ -; RUN: opt -S -instsimplify < %s | FileCheck %s - -; CHECK-LABEL: @one -define i32 @one(i32 %a) { -; CHECK: ret i32 0 - %b = icmp ugt i32 %a, 5 - %c = select i1 %b, i32 2, i32 %a - %d = lshr i32 %c, 24 - ret i32 %d -} - -; CHECK-LABEL: @two -define i32 @two(i32 %a) { -; CHECK: ret i32 0 - %x = add nsw i32 %a, 4 - %b = icmp ugt i32 %x, 5 - %c = select i1 %b, i32 2, i32 %a - %d = lshr i32 %c, 24 - ret i32 %d -} - -; CHECK-LABEL: @two_no_nsw -define i32 @two_no_nsw(i32 %a) { -; CHECK: ret i32 %d - %x = add i32 %a, 4 - %b = icmp ugt i32 %x, 5 - %c = select i1 %b, i32 2, i32 %a - %d = lshr i32 %c, 24 - ret i32 %d -} - -; CHECK-LABEL: @three -define i32 @three(i32 %a) { -; CHECK: ret i32 0 - %x = add nsw i32 %a, -4 - %b = icmp ugt i32 %a, 5 - %c = select i1 %b, i32 2, i32 %x - %d = lshr i32 %c, 24 - ret i32 %d -} - -; CHECK-LABEL: @four -define i32 @four(i32 %a) { -; CHECK: ret i32 0 - %x = add nsw i32 %a, 42 - %y = add nsw i32 %a, 64 - %b = icmp ugt i32 %y, 5 - %c = select i1 %b, i32 2, i32 %x - %d = lshr i32 %c, 24 - ret i32 %d -} - -; CHECK-LABEL: @four_swapped -define i32 @four_swapped(i32 %a) { -; CHECK: ret i32 %d - %x = add nsw i32 %a, 42 - %y = add nsw i32 %a, 64 - %b = icmp ugt i32 %x, 5 - %c = select i1 %b, i32 2, i32 %y - %d = lshr i32 %c, 24 - ret i32 %d -} \ No newline at end of file