blob: c0982027d40c016f6de5813a7ad75e7fdd89fcb9 [file] [edit]
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64v1.5-unknown-unknown --spirv-ext=+SPV_KHR_float_controls2 %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64v1.5-unknown-unknown --spirv-ext=+SPV_KHR_float_controls2 %s -o - -filetype=obj | spirv-val %}
; Check that nofpclass attributes on OpenCL builtin calls are translated to
; FPFastMathMode decorations on the corresponding OpExtInst instructions.
; CHECK-DAG: OpDecorate %[[#FMAX_RES:]] FPFastMathMode NotNaN|NotInf
; CHECK-DAG: OpDecorate %[[#FMIN_RES:]] FPFastMathMode NotInf
; CHECK-DAG: OpDecorate %[[#LDEXP_RES:]] FPFastMathMode NotNaN|NotInf
; CHECK: %[[#FMAX_RES]] = OpExtInst %[[#]] %[[#]] fmax
; CHECK: %[[#FMIN_RES]] = OpExtInst %[[#]] %[[#]] fmin
; CHECK: %[[#LDEXP_RES]] = OpExtInst %[[#]] %[[#]] ldexp
; nofpclass(nan inf) on return and all float params -> NotNaN|NotInf
declare spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fmaxff(float noundef nofpclass(nan inf), float noundef nofpclass(nan inf))
; nofpclass(inf) on first param only, nofpclass(nan inf) on second -> NotInf
declare spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fminff(float noundef nofpclass(inf), float noundef nofpclass(nan inf))
; nofpclass(nan inf) on return and float param, i32 param skipped -> NotNaN|NotInf
declare spir_func noundef nofpclass(nan inf) float @_Z17__spirv_ocl_ldexpfi(float noundef nofpclass(nan inf), i32 noundef)
define spir_kernel void @test(ptr addrspace(1) %data, ptr addrspace(1) %a, ptr addrspace(1) %b) {
entry:
%0 = load float, ptr addrspace(1) %a, align 4
%1 = load float, ptr addrspace(1) %b, align 4
%fmax = call spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fmaxff(float noundef nofpclass(nan inf) %0, float noundef nofpclass(nan inf) %1)
store float %fmax, ptr addrspace(1) %data, align 4
%fmin = call spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fminff(float noundef nofpclass(inf) %0, float noundef nofpclass(nan inf) %1)
store float %fmin, ptr addrspace(1) %data, align 4
%2 = load i32, ptr addrspace(1) %b, align 4
%ldexp = call spir_func noundef nofpclass(nan inf) float @_Z17__spirv_ocl_ldexpfi(float noundef nofpclass(nan inf) %0, i32 noundef %2)
store float %ldexp, ptr addrspace(1) %data, align 4
ret void
}