From 9324a77aa48151f1766193ffc5f9590da5edb61b Mon Sep 17 00:00:00 2001 From: Stanislav Mekhanoshin Date: Mon, 28 Aug 2017 18:00:08 +0000 Subject: [PATCH] [AMDGPU] Fix regression in AMDGPULibCalls allowing native for doubles Under -cl-fast-relaxed-math we could use native_sqrt, but f64 was allowed to produce HSAIL's nsqrt instruction. HSAIL is not here and we stick with non-existing native_sqrt(double) as a result. Add check for f64 to not return native functions and also remove handling of f64 case for fold_sqrt. Differential Revision: https://reviews.llvm.org/D37223 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311900 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/AMDGPULibCalls.cpp | 6 +++--- test/CodeGen/AMDGPU/simplify-libcalls.ll | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/Target/AMDGPU/AMDGPULibCalls.cpp b/lib/Target/AMDGPU/AMDGPULibCalls.cpp index 57cb2a6a921..ff89ce7b96f 100644 --- a/lib/Target/AMDGPU/AMDGPULibCalls.cpp +++ b/lib/Target/AMDGPU/AMDGPULibCalls.cpp @@ -1170,6 +1170,8 @@ bool AMDGPULibCalls::fold_fma_mad(CallInst *CI, IRBuilder<> &B, // Get a scalar native builtin signle argument FP function Constant* AMDGPULibCalls::getNativeFunction(Module* M, const FuncInfo& FInfo) { + if (getArgType(FInfo) == AMDGPULibFunc::F64 || !HasNative(FInfo.getId())) + return nullptr; FuncInfo nf = FInfo; nf.setPrefix(AMDGPULibFunc::NATIVE); return getFunction(M, nf); @@ -1178,9 +1180,7 @@ Constant* AMDGPULibCalls::getNativeFunction(Module* M, const FuncInfo& FInfo) { // fold sqrt -> native_sqrt (x) bool AMDGPULibCalls::fold_sqrt(CallInst *CI, IRBuilder<> &B, const FuncInfo &FInfo) { - if ((getArgType(FInfo) == AMDGPULibFunc::F32 || - getArgType(FInfo) == AMDGPULibFunc::F64) && - (getVecSize(FInfo) == 1) && + if (getArgType(FInfo) == AMDGPULibFunc::F32 && (getVecSize(FInfo) == 1) && (FInfo.getPrefix() != AMDGPULibFunc::NATIVE)) { if (Constant *FPExpr = getNativeFunction( CI->getModule(), AMDGPULibFunc(AMDGPULibFunc::EI_SQRT, FInfo))) { diff --git a/test/CodeGen/AMDGPU/simplify-libcalls.ll b/test/CodeGen/AMDGPU/simplify-libcalls.ll index e487f3c417e..eab1fe4c70f 100644 --- a/test/CodeGen/AMDGPU/simplify-libcalls.ll +++ b/test/CodeGen/AMDGPU/simplify-libcalls.ll @@ -641,7 +641,18 @@ entry: ret void } +; GCN-LABEL: {{^}}define amdgpu_kernel void @test_dont_use_native_sqrt_fast_f64 +; GCN: tail call fast double @_Z4sqrtd(double %tmp) +define amdgpu_kernel void @test_dont_use_native_sqrt_fast_f64(double addrspace(1)* nocapture %a) { +entry: + %tmp = load double, double addrspace(1)* %a, align 8 + %call = tail call fast double @_Z4sqrtd(double %tmp) + store double %call, double addrspace(1)* %a, align 8 + ret void +} + declare float @_Z4sqrtf(float) +declare double @_Z4sqrtd(double) ; GCN-LABEL: {{^}}define amdgpu_kernel void @test_use_native_rsqrt ; GCN-NATIVE: tail call fast float @_Z12native_rsqrtf(float %tmp) -- 2.50.1