Index: lib/Target/AMDGPU/AMDGPULibCalls.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPULibCalls.cpp +++ lib/Target/AMDGPU/AMDGPULibCalls.cpp @@ -1170,6 +1170,8 @@ // 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 @@ // 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))) { Index: test/CodeGen/AMDGPU/simplify-libcalls.ll =================================================================== --- test/CodeGen/AMDGPU/simplify-libcalls.ll +++ test/CodeGen/AMDGPU/simplify-libcalls.ll @@ -641,7 +641,18 @@ 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)