diff options
author | Matthias Braun <matze@braunis.de> | 2015-04-30 22:04:26 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2015-04-30 22:04:26 +0000 |
commit | ec6833420fa3c6f44c0e464ed2cbc6c483f37781 (patch) | |
tree | 8da3c323e0ecdd79e19a2a6082b2a80f601f129e /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 868b3f47d216e9ab0fb1e72155524f20f8deb23d (diff) | |
download | bcm5719-llvm-ec6833420fa3c6f44c0e464ed2cbc6c483f37781.tar.gz bcm5719-llvm-ec6833420fa3c6f44c0e464ed2cbc6c483f37781.zip |
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
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index c608f84bc7b..5f8746e7a15 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); + } + } } |