diff options
author | Davide Italiano <davide@freebsd.org> | 2016-12-15 23:45:11 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2016-12-15 23:45:11 +0000 |
commit | 85ad36b0e01210fad939126e47a994b76a1cbd10 (patch) | |
tree | 202d085344ce100cd5b5afff33568d432a85a6d3 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | |
parent | 2e1626879e05bf4aa57e0707dc1b6b5261e64c85 (diff) | |
download | bcm5719-llvm-85ad36b0e01210fad939126e47a994b76a1cbd10.tar.gz bcm5719-llvm-85ad36b0e01210fad939126e47a994b76a1cbd10.zip |
[SimplifyLibCalls] Lower fls() to llvm.ctlz().
Differential Revision: https://reviews.llvm.org/D14590
llvm-svn: 289894
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index d3eae6e3d87..d11c2156a83 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -1534,6 +1534,18 @@ Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilder<> &B) { return B.CreateSelect(Cond, V, B.getInt32(0)); } +Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilder<> &B) { + // fls(x) -> (i32)(sizeInBits(x) - llvm.ctlz(x, false)) + Value *Op = CI->getArgOperand(0); + Type *ArgType = Op->getType(); + Value *F = Intrinsic::getDeclaration(CI->getCalledFunction()->getParent(), + Intrinsic::ctlz, ArgType); + Value *V = B.CreateCall(F, {Op, B.getFalse()}, "ctlz"); + V = B.CreateSub(ConstantInt::get(V->getType(), ArgType->getIntegerBitWidth()), + V); + return B.CreateIntCast(V, CI->getType(), false); +} + Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilder<> &B) { // abs(x) -> x >s -1 ? x : -x Value *Op = CI->getArgOperand(0); @@ -2070,6 +2082,10 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) { case LibFunc::ffsl: case LibFunc::ffsll: return optimizeFFS(CI, Builder); + case LibFunc::fls: + case LibFunc::flsl: + case LibFunc::flsll: + return optimizeFls(CI, Builder); case LibFunc::abs: case LibFunc::labs: case LibFunc::llabs: |