From ec6833420fa3c6f44c0e464ed2cbc6c483f37781 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 30 Apr 2015 22:04:26 +0000 Subject: [PATCH] InstCombine: Move Sub->Xor rule from SimplifyDemanded to InstCombine The rule that turns a sub to xor if the LHS is 2^n-1 and the remaining bits are known zero, does not use the demanded bits at all: Move it to the normal InstCombine code path. Differential Revision: http://reviews.llvm.org/D9417 llvm-svn: 236268 --- llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 13 +++++++++++++ .../Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 10 ---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index c608f84..5f8746e 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1586,6 +1586,19 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { CI->getValue() == I.getType()->getPrimitiveSizeInBits() - 1) return BinaryOperator::CreateLShr(X, CI); } + + // Turn this into a xor if LHS is 2^n-1 and the remaining bits are known + // zero. + APInt IntVal = C->getValue(); + if ((IntVal + 1).isPowerOf2()) { + unsigned BitWidth = I.getType()->getScalarSizeInBits(); + APInt KnownZero(BitWidth, 0); + APInt KnownOne(BitWidth, 0); + computeKnownBits(&I, KnownZero, KnownOne, 0, &I); + if ((IntVal | KnownZero).isAllOnesValue()) { + return BinaryOperator::CreateXor(Op1, C); + } + } } diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 3dbb1b1..ac92133 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -630,16 +630,6 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask, // Otherwise just hand the sub off to computeKnownBits to fill in // the known zeros and ones. computeKnownBits(V, KnownZero, KnownOne, Depth, CxtI); - - // Turn this into a xor if LHS is 2^n-1 and the remaining bits are known - // zero. - if (ConstantInt *C0 = dyn_cast(I->getOperand(0))) { - APInt I0 = C0->getValue(); - if ((I0 + 1).isPowerOf2() && (I0 | KnownZero).isAllOnesValue()) { - Instruction *Xor = BinaryOperator::CreateXor(I->getOperand(1), C0); - return InsertNewInstWith(Xor, *I); - } - } break; case Instruction::Shl: if (ConstantInt *SA = dyn_cast(I->getOperand(1))) { -- 2.7.4