spatel created this revision. Herald added a subscriber: mcrosier. This patch is intended to answer a question raised in PR27435: https://bugs.llvm.org/show_bug.cgi?id=27435
Is a programmer using __builtin_sqrt() invoking the compiler's intrinsic definition of sqrt or the mathlib definition of sqrt? I know there are follow-up bugs that still need to be solved (https://reviews.llvm.org/D28335), but I think we should answer this first. Also if this patch is correct, it is enough to produce the hoped-for result in the PR27435 examples because we'll get this IR at -O2: $ ./clang -O2 27435.c -S -o - -emit-llvm | grep llvm.sqrt %2 = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %1) %2 = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %1) https://reviews.llvm.org/D39204 Files: lib/CodeGen/CGBuiltin.cpp test/CodeGen/builtins.c Index: test/CodeGen/builtins.c =================================================================== --- test/CodeGen/builtins.c +++ test/CodeGen/builtins.c @@ -318,13 +318,13 @@ // CHECK: call x86_fp80 @llvm.floor.f80 resf = __builtin_sqrtf(F); - // CHECK: call float @sqrtf( + // CHECK: call float @llvm.sqrt.f32 resd = __builtin_sqrt(D); - // CHECK: call double @sqrt( + // CHECK: call double @llvm.sqrt.f64 resld = __builtin_sqrtl(LD); - // CHECK: call x86_fp80 @sqrtl( + // CHECK: call x86_fp80 @llvm.sqrt.f80 resf = __builtin_truncf(F); // CHECK: call float @llvm.trunc.f32 Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -941,6 +941,12 @@ case Builtin::BI__builtin_roundl: { return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::round)); } + + case Builtin::BI__builtin_sqrt: + case Builtin::BI__builtin_sqrtf: + case Builtin::BI__builtin_sqrtl: + return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::sqrt)); + case Builtin::BI__builtin_fmin: case Builtin::BI__builtin_fminf: case Builtin::BI__builtin_fminl: {
Index: test/CodeGen/builtins.c =================================================================== --- test/CodeGen/builtins.c +++ test/CodeGen/builtins.c @@ -318,13 +318,13 @@ // CHECK: call x86_fp80 @llvm.floor.f80 resf = __builtin_sqrtf(F); - // CHECK: call float @sqrtf( + // CHECK: call float @llvm.sqrt.f32 resd = __builtin_sqrt(D); - // CHECK: call double @sqrt( + // CHECK: call double @llvm.sqrt.f64 resld = __builtin_sqrtl(LD); - // CHECK: call x86_fp80 @sqrtl( + // CHECK: call x86_fp80 @llvm.sqrt.f80 resf = __builtin_truncf(F); // CHECK: call float @llvm.trunc.f32 Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -941,6 +941,12 @@ case Builtin::BI__builtin_roundl: { return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::round)); } + + case Builtin::BI__builtin_sqrt: + case Builtin::BI__builtin_sqrtf: + case Builtin::BI__builtin_sqrtl: + return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::sqrt)); + case Builtin::BI__builtin_fmin: case Builtin::BI__builtin_fminf: case Builtin::BI__builtin_fminl: {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits