diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-05-22 15:36:50 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-05-22 15:36:50 +0000 |
commit | 1ff6b27940bc88c6cf5234bc39bf97038b4da602 (patch) | |
tree | 54acce6a27960b2bc115b649694d17685a7d4fc7 /clang/lib/CodeGen | |
parent | b6e5d4ead116a389e185cf0ee357d584933a15c4 (diff) | |
download | bcm5719-llvm-1ff6b27940bc88c6cf5234bc39bf97038b4da602.tar.gz bcm5719-llvm-1ff6b27940bc88c6cf5234bc39bf97038b4da602.zip |
[CodeGen] produce the LLVM canonical form of abs
We chose the 'slt' form as canonical in IR with:
rL332819
...so we should generate that form directly for efficiency.
llvm-svn: 332989
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c6f0b30bc76..7f1e1255604 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1251,16 +1251,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, case Builtin::BI__builtin_abs: case Builtin::BI__builtin_labs: case Builtin::BI__builtin_llabs: { + // X < 0 ? -X : X Value *ArgValue = EmitScalarExpr(E->getArg(0)); - Value *NegOp = Builder.CreateNeg(ArgValue, "neg"); - Value *CmpResult = - Builder.CreateICmpSGE(ArgValue, - llvm::Constant::getNullValue(ArgValue->getType()), - "abscond"); - Value *Result = - Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs"); - + Constant *Zero = llvm::Constant::getNullValue(ArgValue->getType()); + Value *CmpResult = Builder.CreateICmpSLT(ArgValue, Zero, "abscond"); + Value *Result = Builder.CreateSelect(CmpResult, NegOp, ArgValue, "abs"); return RValue::get(Result); } case Builtin::BI__builtin_conj: |