Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions llvm/test/CodeGen/SPIRV/transcoding/OpenCL/convert_functions.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
; This test checks that functions with `convert_` prefix are translated as
; OpenCL builtins only in case they match the specification. Otherwise, we
; expect such functions to be translated to SPIR-V FunctionCall.

; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}

; CHECK-SPIRV: OpName %[[#Func:]] "_Z18convert_float_func"
; CHECK-SPIRV: OpName %[[#Func1:]] "_Z20convert_uint_satfunc"
; CHECK-SPIRV: OpName %[[#Func2:]] "_Z21convert_float_rtzfunc"
; CHECK-SPIRV-DAG: %[[#VoidTy:]] = OpTypeVoid
; CHECK-SPIRV-DAG: %[[#CharTy:]] = OpTypeInt 8
; CHECK-SPIRV-DAG: %[[#FloatTy:]] = OpTypeFloat 32

; CHECK-SPIRV: %[[#Func]] = OpFunction %[[#VoidTy]] None %[[#]]
; CHECK-SPIRV: %[[#ConvertId1:]] = OpUConvert %[[#CharTy]] %[[#]]
; CHECK-SPIRV: %[[#ConvertId2:]] = OpConvertSToF %[[#FloatTy]] %[[#]]
; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func]] %[[#ConvertId2]]
; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func1]] %[[#]]
; CHECK-SPIRV: %[[#]] = OpFunctionCall %[[#VoidTy]] %[[#Func2]] %[[#ConvertId2]]
; CHECK-SPIRV-NOT: OpFConvert
; CHECK-SPIRV-NOT: OpConvertUToF

define dso_local spir_func void @_Z18convert_float_func(float noundef %x) {
entry:
%x.addr = alloca float, align 4
store float %x, ptr %x.addr, align 4
ret void
}

define dso_local spir_func void @_Z20convert_uint_satfunc(i32 noundef %x) {
entry:
ret void
}

define dso_local spir_func void @_Z21convert_float_rtzfunc(float noundef %x) {
entry:
ret void
}

define dso_local spir_func void @convert_int_bf16(i32 noundef %x) {
entry:
%x.addr = alloca i32, align 4
store i32 %x, ptr %x.addr, align 4
%0 = load i32, ptr %x.addr, align 4
call spir_func signext i8 @_Z16convert_char_rtei(i32 noundef %0)
%call = call spir_func float @_Z13convert_floati(i32 noundef %0)
call spir_func void @_Z18convert_float_func(float noundef %call)
call spir_func void @_Z20convert_uint_satfunc(i32 noundef %0)
call spir_func void @_Z21convert_float_rtzfunc(float noundef %call)
ret void
}

declare spir_func signext i8 @_Z16convert_char_rtei(i32 noundef)

declare spir_func float @_Z13convert_floati(i32 noundef)
15 changes: 15 additions & 0 deletions llvm/test/CodeGen/SPIRV/transcoding/OpenCL/nan.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}

; Check OpenCL built-in nan translation.

; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] nan %[[#]]

define dso_local spir_kernel void @test(ptr addrspace(1) align 4 %a, i32 %b) {
entry:
%call = tail call spir_func float @_Z3nanj(i32 %b)
store float %call, ptr addrspace(1) %a, align 4
ret void
}

declare spir_func float @_Z3nanj(i32)
23 changes: 23 additions & 0 deletions llvm/test/CodeGen/SPIRV/transcoding/OpenCL/shuffle.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}

; Check OpenCL built-in shuffle and shuffle2 translation.

; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] shuffle %[[#]] %[[#]]
; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] shuffle2 %[[#]] %[[#]] %[[#]]

define spir_kernel void @test() {
entry:
%call = call spir_func <2 x float> @_Z7shuffleDv2_fDv2_j(<2 x float> zeroinitializer, <2 x i32> zeroinitializer)
ret void
}

declare spir_func <2 x float> @_Z7shuffleDv2_fDv2_j(<2 x float>, <2 x i32>)

define spir_kernel void @test2() {
entry:
%call = call spir_func <4 x float> @_Z8shuffle2Dv2_fS_Dv4_j(<2 x float> zeroinitializer, <2 x float> zeroinitializer, <4 x i32> zeroinitializer)
ret void
}

declare spir_func <4 x float> @_Z8shuffle2Dv2_fS_Dv4_j(<2 x float>, <2 x float>, <4 x i32>)
14 changes: 14 additions & 0 deletions llvm/test/CodeGen/SPIRV/transcoding/printf.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}

@.str = private unnamed_addr addrspace(2) constant [12 x i8] c"Hello World\00", align 1

; CHECK-SPIRV: %[[#]] = OpExtInst %[[#]] %[[#]] printf %[[#]]

define dso_local spir_kernel void @BuiltinPrintf() {
entry:
%call = tail call i32 (ptr addrspace(2), ...) @printf(ptr addrspace(2) noundef @.str)
ret void
}

declare noundef i32 @printf(ptr addrspace(2) nocapture noundef readonly, ...)