diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 768dc95243531..9f034aba874a8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -5450,16 +5450,8 @@ Instruction *InstCombinerImpl::foldICmpEquality(ICmpInst &I) { Constant *Cst; if (match(&I, m_c_ICmp(PredUnused, m_OneUse(m_Xor(m_Value(A), m_ImmConstant(Cst))), - m_Value(B)))) { - // Special case: - // icmp eq/ne OneUse(A ^ Cst1), Cst2 --> icmp eq/ne A, Cst1 ^ Cst2 - // We handle this to avoid infinite loops. - if (match(B, m_ImmConstant())) { - if (Value *V = simplifyXorInst(B, Cst, SQ.getWithInstruction(&I))) - return new ICmpInst(Pred, A, V); - } else - return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst); - } + m_CombineAnd(m_Value(B), m_Unless(m_ImmConstant()))))) + return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst); return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/icmp-equality-xor.ll b/llvm/test/Transforms/InstCombine/icmp-equality-xor.ll index f9ba74bcbf7b9..f5d5ef32c81e8 100644 --- a/llvm/test/Transforms/InstCombine/icmp-equality-xor.ll +++ b/llvm/test/Transforms/InstCombine/icmp-equality-xor.ll @@ -136,7 +136,8 @@ define i1 @foo2(i32 %x, i32 %y) { define <2 x i1> @foo3(<2 x i8> %x) { ; CHECK-LABEL: @foo3( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[XOR]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; entry: