From: Chris Lattner Date: Mon, 9 Jun 2008 08:26:51 +0000 (+0000) Subject: lower calls to abs to inline code, PR2337 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=313f0e63f7c751e2ef6b2dbc163f1b68d2bcc4c8;p=oota-llvm.git lower calls to abs to inline code, PR2337 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52138 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index cb90bdc912a..30c9baf2770 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -984,6 +984,27 @@ struct VISIBILITY_HIDDEN IsAsciiOpt : public LibCallOptimization { return B.CreateZExt(Op, CI->getType()); } }; + +//===---------------------------------------===// +// 'abs', 'labs', 'llabs' Optimizations + +struct VISIBILITY_HIDDEN AbsOpt : public LibCallOptimization { + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder &B) { + const FunctionType *FT = Callee->getFunctionType(); + // We require integer(integer) where the types agree. + if (FT->getNumParams() != 1 || !isa(FT->getReturnType()) || + FT->getParamType(0) != FT->getReturnType()) + return 0; + + // abs(x) -> x >s -1 ? x : -x + Value *Op = CI->getOperand(1); + Value *Pos = B.CreateICmpSGT(Op,ConstantInt::getAllOnesValue(Op->getType()), + "ispos"); + Value *Neg = B.CreateNeg(Op, "neg"); + return B.CreateSelect(Pos, Op, Neg); + } +}; + //===---------------------------------------===// // 'toascii' Optimizations @@ -1258,7 +1279,8 @@ namespace { // Math Library Optimizations PowOpt Pow; Exp2Opt Exp2; UnaryDoubleFPOpt UnaryDoubleFP; // Integer Optimizations - FFSOpt FFS; IsDigitOpt IsDigit; IsAsciiOpt IsAscii; ToAsciiOpt ToAscii; + FFSOpt FFS; AbsOpt Abs; IsDigitOpt IsDigit; IsAsciiOpt IsAscii; + ToAsciiOpt ToAscii; // Formatting and IO Optimizations SPrintFOpt SPrintF; PrintFOpt PrintF; FWriteOpt FWrite; FPutsOpt FPuts; FPrintFOpt FPrintF; @@ -1328,6 +1350,9 @@ void SimplifyLibCalls::InitOptimizations() { Optimizations["ffs"] = &FFS; Optimizations["ffsl"] = &FFS; Optimizations["ffsll"] = &FFS; + Optimizations["abs"] = &Abs; + Optimizations["labs"] = &Abs; + Optimizations["llabs"] = &Abs; Optimizations["isdigit"] = &IsDigit; Optimizations["isascii"] = &IsAscii; Optimizations["toascii"] = &ToAscii; diff --git a/test/Transforms/SimplifyLibCalls/abs.ll b/test/Transforms/SimplifyLibCalls/abs.ll new file mode 100644 index 00000000000..520189bb28f --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/abs.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | grep {select i1 %ispos} +; PR2337 + +define i32 @test(i32 %x) { +entry: + %call = call i32 @abs( i32 %x ) ; [#uses=1] + ret i32 %call +} + +declare i32 @abs(i32) +