[PATCH] CodeGen: Emit sqrt intrinsic from __builtin_sqrt
Tom Stellard
thomas.stellard at amd.com
Thu Mar 19 14:51:59 PDT 2015
Hi doug.gregor, hfinkel,
We need to add a check for x < -0.0 before the intrinsic, because it has undefined behavior in this case.
REPOSITORY
rL LLVM
http://reviews.llvm.org/D8468
Files:
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/builtins.c
Index: lib/CodeGen/CGBuiltin.cpp
===================================================================
--- lib/CodeGen/CGBuiltin.cpp
+++ lib/CodeGen/CGBuiltin.cpp
@@ -1364,6 +1364,22 @@
return RValue::get(Builder.CreateCall(F, Arg0));
}
+ case Builtin::BI__builtin_sqrt:
+ case Builtin::BI__builtin_sqrtf:
+ case Builtin::BI__builtin_sqrtl: {
+ // Lib functions with the __builtin prefix don't set errno, so we can safely
+ // use the intrinsic here. We just need to add a check for x < -0.0
+ Value *Arg0 = EmitScalarExpr(E->getArg(0));
+ llvm::Type *ArgType = Arg0->getType();
+ Value *F = CGM.getIntrinsic(Intrinsic::sqrt, ArgType);
+ Value *Sqrt = Builder.CreateCall(F, Arg0);
+ Value *Cmp = Builder.CreateFCmpOLT(Arg0,
+ ConstantFP::getNegativeZero(ArgType));
+ return RValue::get(Builder.CreateSelect(Cmp, ConstantFP::getNaN(ArgType),
+ Sqrt));
+
+ }
+
case Builtin::BI__builtin_pow:
case Builtin::BI__builtin_powf:
case Builtin::BI__builtin_powl:
Index: test/CodeGen/builtins.c
===================================================================
--- test/CodeGen/builtins.c
+++ test/CodeGen/builtins.c
@@ -236,3 +236,25 @@
// CHECK: call i64 @llvm.readcyclecounter()
return __builtin_readcyclecounter();
}
+
+// CHECK-LABEL: define void @test_float_builtin_libcalls
+void test_float_builtin_libcalls(float F, double D, long double LD) {
+ volatile float resf;
+ volatile double resd;
+ volatile long double resld;
+
+ resf = __builtin_sqrtf(F);
+ // CHECK-DAG: [[SQRTF:%.*]] = call float @llvm.sqrt.f32(float
+ // CHECK-DAG: [[FCMPF:%.*]] = fcmp olt float {{.*}}, -0.000000e+00
+ // CHECK: select i1 [[FCMPF]], float 0x7FF8000000000000, float [[SQRTF]]
+
+ resd = __builtin_sqrt(D);
+ // CHECK-DAG: [[SQRTD:%.*]] = call double @llvm.sqrt.f64(double
+ // CHECK-DAG: [[FCMPD:%.*]] = fcmp olt double {{.*}}, -0.000000e+00
+ // CHECK: select i1 [[FCMPD]], double 0x7FF8000000000000, double [[SQRTD]]
+
+ resld = __builtin_sqrtl(LD);
+ // CHECK-DAG: [[SQRTL:%.*]] = call x86_fp80 @llvm.sqrt.f80(x86_fp80
+ // CHECK-DAG: [[FCMPL:%.*]] = fcmp olt x86_fp80 {{.*}}, 0xK80000000000000000000
+ // CHECK: select i1 [[FCMPL]], x86_fp80 0xK7FFFC000000000000000, x86_fp80 [[SQRTL]]
+}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8468.22308.patch
Type: text/x-patch
Size: 2331 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150319/3fd89222/attachment.bin>
More information about the llvm-commits
mailing list