diff --git a/lib/SPIRV/SPIRVWriter.cpp b/lib/SPIRV/SPIRVWriter.cpp index cea4e2d1b..1b8697541 100644 --- a/lib/SPIRV/SPIRVWriter.cpp +++ b/lib/SPIRV/SPIRVWriter.cpp @@ -3084,8 +3084,11 @@ bool LLVMToSPIRVBase::transDecoration(Value *V, SPIRVValue *BV) { bool ToAddNoNan = RetTest & fcNan; bool ToAddNoInf = RetTest & fcInf; if (ToAddNoNan || ToAddNoInf) { - const size_t NumParams = F->getFunctionType()->getNumParams(); + const auto *FT = F->getFunctionType(); + const size_t NumParams = FT->getNumParams(); for (size_t I = 0; I != NumParams; ++I) { + if (!FT->getParamType(I)->isFloatTy()) + continue; if (!F->hasParamAttribute(I, Attribute::NoFPClass)) { ToAddNoNan = false; ToAddNoInf = false; diff --git a/test/transcoding/fast-math-opencl-builtins.ll b/test/transcoding/fast-math-opencl-builtins.ll index ce0e672b7..73ec3ee3e 100644 --- a/test/transcoding/fast-math-opencl-builtins.ll +++ b/test/transcoding/fast-math-opencl-builtins.ll @@ -9,19 +9,23 @@ ; CHECK-SPIRV: Decorate [[#FPDec1:]] FPFastMathMode 3 ; CHECK-SPIRV: Decorate [[#FPDec2:]] FPFastMathMode 2 -; CHECK-SPIRV: Decorate [[#FPDec3:]] FPFastMathMode 16 +; CHECK-SPIRV: Decorate [[#FPDec3:]] FPFastMathMode 3 +; CHECK-SPIRV: Decorate [[#FPDec4:]] FPFastMathMode 16 ; CHECK-SPIRV: ExtInst [[#]] [[#FPDec1]] [[#]] fmax [[#]] [[#]] ; CHECK-SPIRV: ExtInst [[#]] [[#FPDec2]] [[#]] fmin [[#]] [[#]] -; CHECK-SPIRV: ExtInst [[#]] [[#FPDec3]] [[#]] fmax [[#]] [[#]] +; CHECK-SPIRV: ExtInst [[#]] [[#FPDec3]] [[#]] ldexp [[#]] [[#]] +; CHECK-SPIRV: ExtInst [[#]] [[#FPDec4]] [[#]] fmax [[#]] [[#]] ; CHECK-SPIRV-NEG-NOT: Decorate [[#]] FPFastMathMode [[#]] ; CHECK-LLVM-OCL: call nnan ninf spir_func float @_Z4fmaxff(float %[[#]], float %[[#]]) ; CHECK-LLVM-OCL: call ninf spir_func float @_Z4fminff(float %[[#]], float %[[#]]) +; CHECK-LLVM-OCL: call nnan ninf spir_func float @_Z5ldexpfi(float %[[#]], i32 %[[#]]) ; CHECK-LLVM-OCL: call fast spir_func float @_Z4fmaxff(float %[[#]], float %[[#]]) ; CHECK-LLVM-SPV: call nnan ninf spir_func float @_Z16__spirv_ocl_fmaxff(float %[[#]], float %[[#]]) ; CHECK-LLVM-SPV: call ninf spir_func float @_Z16__spirv_ocl_fminff(float %[[#]], float %[[#]]) +; CHECK-LLVM-SPV: call nnan ninf spir_func float @_Z17__spirv_ocl_ldexpfi(float %[[#]], i32 %[[#]]) ; CHECK-LLVM-SPV: call fast spir_func float @_Z16__spirv_ocl_fmaxff(float %[[#]], float %[[#]]) ; ModuleID = 'test.bc' @@ -34,6 +38,8 @@ target triple = "spir64-unknown-unknown" declare dso_local spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fmaxff(float noundef nofpclass(nan inf), float noundef nofpclass(nan inf)) local_unnamed_addr declare dso_local spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fminff(float noundef nofpclass(inf), float noundef nofpclass(nan inf)) local_unnamed_addr + +declare dso_local spir_func noundef nofpclass(nan inf) float @_Z17__spirv_ocl_ldexpfi(float noundef nofpclass(nan inf), i32 noundef) define weak_odr dso_local spir_kernel void @nofpclass_all(ptr addrspace(1) noundef align 4 %_arg_data, ptr addrspace(1) noundef align 4 %_arg_dat1, ptr addrspace(1) noundef align 4 %_arg_dat2) local_unnamed_addr { entry: @@ -63,6 +69,20 @@ entry: ret void } +define weak_odr dso_local spir_kernel void @nofpclass_int(ptr addrspace(1) noundef align 4 %_arg_data, ptr addrspace(1) noundef align 4 %_arg_dat1, ptr addrspace(1) noundef align 4 %_arg_dat2) local_unnamed_addr { +entry: + %0 = load i64, ptr addrspace(1) @__spirv_BuiltInGlobalInvocationId, align 32 + %arrayidx.i = getelementptr inbounds float, ptr addrspace(1) %_arg_data, i64 %0 + %arrayidx3.i = getelementptr inbounds float, ptr addrspace(1) %_arg_dat1, i64 %0 + %cmp.i = icmp ult i64 %0, 2147483648 + %arrayidx5.i = getelementptr inbounds i32, ptr addrspace(1) %_arg_dat2, i64 %0 + %1 = load float, ptr addrspace(1) %arrayidx3.i, align 4 + %2 = load i32, ptr addrspace(1) %arrayidx5.i, align 4 + %call.i.i = tail call spir_func noundef nofpclass(nan inf) float @_Z17__spirv_ocl_ldexpfi(float noundef nofpclass(inf) %1, i32 noundef %2) + store float %call.i.i, ptr addrspace(1) %arrayidx.i, align 4 + ret void +} + define weak_odr dso_local spir_kernel void @nofpclass_fast(ptr addrspace(1) noundef align 4 %_arg_data, ptr addrspace(1) noundef align 4 %_arg_dat1, ptr addrspace(1) noundef align 4 %_arg_dat2) local_unnamed_addr { entry: %0 = load i64, ptr addrspace(1) @__spirv_BuiltInGlobalInvocationId, align 32