diff options
author | David Bolvansky <david.bolvansky@gmail.com> | 2019-04-02 20:13:28 +0000 |
---|---|---|
committer | David Bolvansky <david.bolvansky@gmail.com> | 2019-04-02 20:13:28 +0000 |
commit | 5ba60b22a476ed3cd10f5a3cff4f4ddd34d0a67b (patch) | |
tree | 0f9879ebf897ee3889693bf4ee863aca7ba89787 /llvm/lib | |
parent | 13d8e929409fb1a1f8a2318250923c90f3abac7c (diff) | |
download | bcm5719-llvm-5ba60b22a476ed3cd10f5a3cff4f4ddd34d0a67b.tar.gz bcm5719-llvm-5ba60b22a476ed3cd10f5a3cff4f4ddd34d0a67b.zip |
[InstCombine] Simplify ctlz/cttz with bitreverse
Summary: Fixes PR41273
Reviewers: spatel
Reviewed By: spatel
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60096
llvm-svn: 357521
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index e6f7e623067..c2506798660 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1324,12 +1324,20 @@ static Instruction *foldCttzCtlz(IntrinsicInst &II, InstCombiner &IC) { assert((II.getIntrinsicID() == Intrinsic::cttz || II.getIntrinsicID() == Intrinsic::ctlz) && "Expected cttz or ctlz intrinsic"); + bool IsTZ = II.getIntrinsicID() == Intrinsic::cttz; Value *Op0 = II.getArgOperand(0); + Value *X; + // ctlz(bitreverse(x)) -> cttz(x) + // cttz(bitreverse(x)) -> ctlz(x) + if (match(Op0, m_BitReverse(m_Value(X)))) { + Intrinsic::ID ID = IsTZ ? Intrinsic::ctlz : Intrinsic::cttz; + Function *F = Intrinsic::getDeclaration(II.getModule(), ID, II.getType()); + return CallInst::Create(F, {X, II.getArgOperand(1)}); + } KnownBits Known = IC.computeKnownBits(Op0, 0, &II); // Create a mask for bits above (ctlz) or below (cttz) the first known one. - bool IsTZ = II.getIntrinsicID() == Intrinsic::cttz; unsigned PossibleZeros = IsTZ ? Known.countMaxTrailingZeros() : Known.countMaxLeadingZeros(); unsigned DefiniteZeros = IsTZ ? Known.countMinTrailingZeros() |