From d038a7fe67d2ea1d677f678d6ba00f9abc8b35e8 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 12 Feb 2015 20:26:46 +0000 Subject: [PATCH] InstCombine: Allow folding of xor into icmp by changing the predicate for vectors The loop vectorizer can create this pattern. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228954 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 7 ++++--- test/Transforms/InstCombine/not.ll | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index c65441e1c85..6178d9c73a1 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -2604,15 +2604,16 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { } } - - if (ConstantInt *RHS = dyn_cast(Op1)) { - if (RHS->isOne() && Op0->hasOneUse()) + if (Constant *RHS = dyn_cast(Op1)) { + if (RHS->isAllOnesValue() && Op0->hasOneUse()) // xor (cmp A, B), true = not (cmp A, B) = !cmp A, B if (CmpInst *CI = dyn_cast(Op0)) return CmpInst::Create(CI->getOpcode(), CI->getInversePredicate(), CI->getOperand(0), CI->getOperand(1)); + } + if (ConstantInt *RHS = dyn_cast(Op1)) { // fold (xor(zext(cmp)), 1) and (xor(sext(cmp)), -1) to ext(!cmp). if (CastInst *Op0C = dyn_cast(Op0)) { if (CmpInst *CI = dyn_cast(Op0C->getOperand(0))) { diff --git a/test/Transforms/InstCombine/not.ll b/test/Transforms/InstCombine/not.ll index 4012ce1ea4b..9d59edd7934 100644 --- a/test/Transforms/InstCombine/not.ll +++ b/test/Transforms/InstCombine/not.ll @@ -52,3 +52,9 @@ entry: %retval67 = zext i1 %tmp3 to i8 ; [#uses=1] ret i8 %retval67 } + +define <2 x i1> @test7(<2 x i32> %A, <2 x i32> %B) { + %cond = icmp sle <2 x i32> %A, %B + %Ret = xor <2 x i1> %cond, + ret <2 x i1> %Ret +} -- 2.34.1