From: Craig Topper Date: Mon, 19 Jun 2017 16:23:46 +0000 (+0000) Subject: [Reassociate] Support some reassociation of vector xors X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9bca3e50b913a9ba8b709c72cee4f23391d9e67;p=llvm [Reassociate] Support some reassociation of vector xors Summary: Currently we don't try to do anything with vector xors. This patch adds support for removing duplicate pairs from a chain of vector xors as its pretty easy to support. We still dont' try to combine the xors with and/ors, but I might try that in a future patch. Reviewers: mcrosier, davide, resistor Reviewed By: mcrosier Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D34338 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305704 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index 4ce32e0eca7..313b1d12009 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -1276,9 +1276,15 @@ Value *ReassociatePass::OptimizeXor(Instruction *I, if (Ops.size() == 1) return nullptr; + Type *Ty = Ops[0].Op->getType(); + + // TODO: We should optimize vector Xor instructions, but they are + // currently unsupported. + if (Ty->isVectorTy()) + return nullptr; + SmallVector Opnds; SmallVector OpndPtrs; - Type *Ty = Ops[0].Op->getType(); APInt ConstOpnd(Ty->getIntegerBitWidth(), 0); // Step 1: Convert ValueEntry to XorOpnd @@ -2000,11 +2006,6 @@ void ReassociatePass::OptimizeInst(Instruction *I) { if (I->isCommutative()) canonicalizeOperands(I); - // TODO: We should optimize vector Xor instructions, but they are - // currently unsupported. - if (I->getType()->isVectorTy() && I->getOpcode() == Instruction::Xor) - return; - // Don't optimize floating point instructions that don't have unsafe algebra. if (I->getType()->isFPOrFPVectorTy() && !I->hasUnsafeAlgebra()) return; diff --git a/test/Transforms/Reassociate/fast-ReassociateVector.ll b/test/Transforms/Reassociate/fast-ReassociateVector.ll index fb76b9d990b..d4c7b809f61 100644 --- a/test/Transforms/Reassociate/fast-ReassociateVector.ll +++ b/test/Transforms/Reassociate/fast-ReassociateVector.ll @@ -205,15 +205,25 @@ define <2 x i32> @test16(<2 x i32> %x, <2 x i32> %y) { ret <2 x i32> %tmp3 } -; FIXME: Optimize vector xor. Currently only commute operands. define <2 x i32> @test17(<2 x i32> %x, <2 x i32> %y) { ; CHECK-LABEL: test17 -; CHECK-NEXT: %tmp1 = xor <2 x i32> %x, %y -; CHECK-NEXT: %tmp2 = xor <2 x i32> %x, %y -; CHECK-NEXT: %tmp3 = xor <2 x i32> %tmp1, %tmp2 +; CHECK-NEXT: ret <2 x i32> zeroinitializer %tmp1 = xor <2 x i32> %x, %y %tmp2 = xor <2 x i32> %y, %x %tmp3 = xor <2 x i32> %tmp1, %tmp2 ret <2 x i32> %tmp3 } + +define <2 x i32> @test18(<2 x i32> %x, <2 x i32> %y) { +; CHECK-LABEL: test18 +; CHECK-NEXT: %tmp5 = xor <2 x i32> %y, %x +; CHECK-NEXT: ret <2 x i32> %tmp5 + + %tmp1 = xor <2 x i32> %x, %y + %tmp2 = xor <2 x i32> %y, %x + %tmp3 = xor <2 x i32> %x, %y + %tmp4 = xor <2 x i32> %tmp1, %tmp2 + %tmp5 = xor <2 x i32> %tmp4, %tmp3 + ret <2 x i32> %tmp5 +}