Index: lib/Transforms/InstCombine/InstCombineAndOrXor.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -1962,14 +1962,14 @@ case ICmpInst::ICMP_EQ: if (LHS->getOperand(0) == RHS->getOperand(0)) { // if LHSCst and RHSCst differ only by one bit: - // (A == C1 || A == C2) -> (A & ~(C1 ^ C2)) == C1 + // (A == C1 || A == C2) -> (A | (C1 ^ C2)) == C2 assert(LHSCst->getValue().ule(LHSCst->getValue())); APInt Xor = LHSCst->getValue() ^ RHSCst->getValue(); if (Xor.isPowerOf2()) { - Value *NegCst = Builder->getInt(~Xor); - Value *And = Builder->CreateAnd(LHS->getOperand(0), NegCst); - return Builder->CreateICmp(ICmpInst::ICMP_EQ, And, LHSCst); + Value *Cst = Builder->getInt(Xor); + Value *Or = Builder->CreateOr(LHS->getOperand(0), Cst); + return Builder->CreateICmp(ICmpInst::ICMP_EQ, Or, RHSCst); } } Index: test/Transforms/InstCombine/icmp.ll =================================================================== --- test/Transforms/InstCombine/icmp.ll +++ test/Transforms/InstCombine/icmp.ll @@ -819,8 +819,8 @@ ; PR14708 ; CHECK-LABEL: @test69( -; CHECK: %1 = and i32 %c, -33 -; CHECK: %2 = icmp eq i32 %1, 65 +; CHECK: %1 = or i32 %c, 32 +; CHECK: %2 = icmp eq i32 %1, 97 ; CHECK: ret i1 %2 define i1 @test69(i32 %c) nounwind uwtable { %1 = icmp eq i32 %c, 97 Index: test/Transforms/InstCombine/load-cmp.ll =================================================================== --- test/Transforms/InstCombine/load-cmp.ll +++ test/Transforms/InstCombine/load-cmp.ll @@ -148,8 +148,8 @@ %S = icmp eq i16 %R, 0 ret i1 %S ; CHECK-LABEL: @test8( -; CHECK-NEXT: and i32 %X, -2 -; CHECK-NEXT: icmp eq i32 {{.*}}, 8 +; CHECK-NEXT: or i32 %X, 1 +; CHECK-NEXT: icmp eq i32 {{.*}}, 9 ; CHECK-NEXT: ret i1 } Index: test/Transforms/InstCombine/or.ll =================================================================== --- test/Transforms/InstCombine/or.ll +++ test/Transforms/InstCombine/or.ll @@ -182,7 +182,7 @@ %D = or i1 %B, %C ret i1 %D ; CHECK-LABEL: @test19( -; CHECK: and i32 +; CHECK: or i32 ; CHECK: icmp eq ; CHECK: ret i1 }