summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-05-22 15:36:50 +0000
committerSanjay Patel <spatel@rotateright.com>2018-05-22 15:36:50 +0000
commit1ff6b27940bc88c6cf5234bc39bf97038b4da602 (patch)
tree54acce6a27960b2bc115b649694d17685a7d4fc7 /clang/lib/CodeGen
parentb6e5d4ead116a389e185cf0ee357d584933a15c4 (diff)
downloadbcm5719-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.cpp12
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:
OpenPOWER on IntegriCloud