Index: lib/Transforms/InstCombine/InstCombineCompares.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCompares.cpp +++ lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3926,9 +3926,9 @@ if (isSignCheck) return APInt::getSignMask(BitWidth); - ConstantInt *CI = dyn_cast(I.getOperand(1)); - if (!CI) return APInt::getAllOnesValue(BitWidth); - const APInt &RHS = CI->getValue(); + const APInt *RHS; + if (!match(I.getOperand(1), m_APInt(RHS))) + return APInt::getAllOnesValue(BitWidth); switch (I.getPredicate()) { // For a UGT comparison, we don't care about any bits that @@ -3936,14 +3936,14 @@ // bits doesn't impact the outcome of the comparison, because any value // greater than the RHS must differ in a bit higher than these due to carry. case ICmpInst::ICMP_UGT: { - unsigned trailingOnes = RHS.countTrailingOnes(); + unsigned trailingOnes = RHS->countTrailingOnes(); return APInt::getBitsSetFrom(BitWidth, trailingOnes); } // Similarly, for a ULT comparison, we don't care about the trailing zeros. // Any value less than the RHS must differ in a higher bit because of carries. case ICmpInst::ICMP_ULT: { - unsigned trailingZeros = RHS.countTrailingZeros(); + unsigned trailingZeros = RHS->countTrailingZeros(); return APInt::getBitsSetFrom(BitWidth, trailingZeros); } Index: test/Transforms/InstCombine/icmp.ll =================================================================== --- test/Transforms/InstCombine/icmp.ll +++ test/Transforms/InstCombine/icmp.ll @@ -1163,11 +1163,10 @@ ret <2 x i1> %cmp } -; FIXME: Vector constant for the 'and' should use less bits. define <2 x i1> @test67vec2(<2 x i32> %x) { ; CHECK-LABEL: @test67vec2( -; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> %x, -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[AND]], +; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], +; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[AND]], zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %and = and <2 x i32> %x,