Home | History | Annotate | Download | only in transcoding
      1 target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
      2 target triple = "spir64-unknown-unknown"
      3 
      4 ; RUN: llvm-as %s -o %t.bc
      5 ; RUN: llvm-spirv %t.bc -o %t.spv
      6 ; RUN: llvm-spirv -r %t.spv -o %t.bc
      7 ; RUN: llvm-dis < %t.bc | FileCheck %s
      8 
      9 ; Check the mangling of 1.2 atomic functions. This test expects that all
     10 ; built-ins are promoted to OpenCL C 2.0 atomics.
     11 ; Most of atomics lost information about the sign of the integer operand
     12 ; but since this concerns only built-ins  with two-complement's arithmetics
     13 ; it shouldn't cause any problems.
     14 
     15 
     16 ; Function Attrs: nounwind
     17 define spir_kernel void @test_atomic_global(i32 addrspace(1)* %dst) #0 {
     18   ; atomic_inc
     19   %inc_ig = tail call spir_func i32 @_Z10atomic_incPVU3AS1i(i32 addrspace(1)* %dst) #0
     20   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS1U7_Atomiciiii(i32 addrspace(1)* {{.*}}, i32 1
     21   %dec_jg = tail call spir_func i32 @_Z10atomic_decPVU3AS1j(i32 addrspace(1)* %dst) #0
     22   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS1U7_Atomiciiii(i32 addrspace(1)* {{.*}}, i32 1
     23 
     24   ; atomic_max
     25   %max_ig = tail call spir_func i32 @_Z10atomic_maxPVU3AS1ii(i32 addrspace(1)* %dst, i32 0) #0
     26   ; CHECK: _Z25atomic_fetch_max_explicitPVU3AS1U7_Atomiciiii
     27   %max_jg = tail call spir_func i32 @_Z10atomic_maxPVU3AS1jj(i32 addrspace(1)* %dst, i32 0) #0
     28   ; CHECK: _Z25atomic_fetch_max_explicitPVU3AS1U7_Atomicjjii
     29 
     30   ; atomic_min
     31   %min_ig = tail call spir_func i32 @_Z10atomic_minPVU3AS1ii(i32 addrspace(1)* %dst, i32 0) #0
     32   ; CHECK: _Z25atomic_fetch_min_explicitPVU3AS1U7_Atomiciiii
     33   %min_jg = tail call spir_func i32 @_Z10atomic_minPVU3AS1jj(i32 addrspace(1)* %dst, i32 0) #0
     34   ; CHECK: _Z25atomic_fetch_min_explicitPVU3AS1U7_Atomicjjii
     35 
     36   ; atomic_add
     37   %add_ig = tail call spir_func i32 @_Z10atomic_addPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     38   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS1U7_Atomiciiii
     39   %add_jg = tail call spir_func i32 @_Z10atomic_addPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     40   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS1U7_Atomiciiii
     41 
     42   ; atomic_sub
     43   %sub_ig = tail call spir_func i32 @_Z10atomic_subPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     44   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS1U7_Atomiciiii
     45   %sub_jg = tail call spir_func i32 @_Z10atomic_subPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     46   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS1U7_Atomiciiii
     47 
     48   ; atomic_or
     49   %or_ig = tail call spir_func i32 @_Z9atomic_orPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     50   ; CHECK: _Z24atomic_fetch_or_explicitPVU3AS1U7_Atomiciiii
     51   %or_jg = tail call spir_func i32 @_Z9atomic_orPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     52   ; CHECK: _Z24atomic_fetch_or_explicitPVU3AS1U7_Atomiciiii
     53 
     54   ; atomic_xor
     55   %xor_ig = tail call spir_func i32 @_Z10atomic_xorPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     56   ; CHECK: _Z25atomic_fetch_xor_explicitPVU3AS1U7_Atomiciiii
     57   %xor_jg = tail call spir_func i32 @_Z10atomic_xorPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     58   ; CHECK: _Z25atomic_fetch_xor_explicitPVU3AS1U7_Atomiciiii
     59 
     60   ; atomic_and
     61   %and_ig = tail call spir_func i32 @_Z10atomic_andPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     62   ; CHECK: _Z25atomic_fetch_and_explicitPVU3AS1U7_Atomiciiii
     63   %and_jg = tail call spir_func i32 @_Z10atomic_andPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     64   ; CHECK: _Z25atomic_fetch_and_explicitPVU3AS1U7_Atomiciiii
     65 
     66   ; atomic_cmpxchg
     67   %cmpxchg_ig = call spir_func i32 @_Z14atomic_cmpxchgPVU3AS1iii(i32 addrspace(1)* %dst, i32 0, i32 1) #0
     68   ; CHECK: _Z39atomic_compare_exchange_strong_explicitPVU3AS1U7
     69   %cmpxchg_jg = call spir_func i32 @_Z14atomic_cmpxchgPVU3AS1jjj(i32 addrspace(1)* %dst, i32 0, i32 1) #0
     70   ; CHECK: _Z39atomic_compare_exchange_strong_explicitPVU3AS1U7
     71   
     72   ; atomic_xchg
     73   %xchg_ig = call spir_func i32 @_Z11atomic_xchgPVU3AS1ii(i32 addrspace(1)* %dst, i32 1) #0
     74   ; CHECK: _Z24atomic_exchange_explicitPVU3AS1U7_Atomiciiii
     75   %xchg_jg = call spir_func i32 @_Z11atomic_xchgPVU3AS1jj(i32 addrspace(1)* %dst, i32 1) #0
     76   ; CHECK: _Z24atomic_exchange_explicitPVU3AS1U7_Atomiciiii
     77   ret void
     78 }
     79 
     80 ; Function Attrs: nounwind
     81 define spir_kernel void @test_atomic_local(i32 addrspace(3)* %dst) #0 {
     82   ; atomic_inc
     83   %inc_il = tail call spir_func i32 @_Z10atomic_incPVU3AS3i(i32 addrspace(3)* %dst) #0
     84   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS3U7_Atomiciiii(i32 addrspace(3)* {{.*}}, i32 1
     85 
     86   ; atomic dec
     87   %dec_jl = tail call spir_func i32 @_Z10atomic_decPVU3AS3j(i32 addrspace(3)* %dst) #0
     88   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS3U7_Atomiciiii(i32 addrspace(3)* {{.*}}, i32 1
     89 
     90   ; atomic_max
     91   %max_il = tail call spir_func i32 @_Z10atomic_maxPVU3AS3ii(i32 addrspace(3)* %dst, i32 0) #0
     92   ; CHECK: _Z25atomic_fetch_max_explicitPVU3AS3U7_Atomiciiii
     93   %max_jl = tail call spir_func i32 @_Z10atomic_maxPVU3AS3jj(i32 addrspace(3)* %dst, i32 0) #0
     94   ; CHECK: _Z25atomic_fetch_max_explicitPVU3AS3U7_Atomicjjii
     95 
     96   ; atomic_min
     97   %min_il = tail call spir_func i32 @_Z10atomic_minPVU3AS3ii(i32 addrspace(3)* %dst, i32 0) #0
     98   ; CHECK: _Z25atomic_fetch_min_explicitPVU3AS3U7_Atomiciiii
     99   %min_jl = tail call spir_func i32 @_Z10atomic_minPVU3AS3jj(i32 addrspace(3)* %dst, i32 0) #0
    100   ; CHECK: _Z25atomic_fetch_min_explicitPVU3AS3U7_Atomicjjii
    101 
    102   ; atomic_add
    103   %add_il = tail call spir_func i32 @_Z10atomic_addPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    104   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS3U7_Atomiciiii
    105   %add_jl = tail call spir_func i32 @_Z10atomic_addPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    106   ; CHECK: _Z25atomic_fetch_add_explicitPVU3AS3U7_Atomiciiii
    107 
    108   ; atomic_sub
    109   %sub_il = tail call spir_func i32 @_Z10atomic_subPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    110   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS3U7_Atomiciiii
    111   %sub_jl = tail call spir_func i32 @_Z10atomic_subPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    112   ; CHECK: _Z25atomic_fetch_sub_explicitPVU3AS3U7_Atomiciiii
    113 
    114   ; atomic_or
    115   %or_il = tail call spir_func i32 @_Z9atomic_orPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    116   ; CHECK: _Z24atomic_fetch_or_explicitPVU3AS3U7_Atomiciiii
    117   %or_jl = tail call spir_func i32 @_Z9atomic_orPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    118   ; CHECK: _Z24atomic_fetch_or_explicitPVU3AS3U7_Atomiciiii
    119 
    120   ; atomic_xor
    121   %xor_il = tail call spir_func i32 @_Z10atomic_xorPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    122   ; CHECK: _Z25atomic_fetch_xor_explicitPVU3AS3U7_Atomiciiii
    123   %xor_jl = tail call spir_func i32 @_Z10atomic_xorPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    124   ; CHECK: _Z25atomic_fetch_xor_explicitPVU3AS3U7_Atomiciiii
    125 
    126   ; atomic_and
    127   %and_il = tail call spir_func i32 @_Z10atomic_andPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    128   ; CHECK: _Z25atomic_fetch_and_explicitPVU3AS3U7_Atomiciiii
    129   %and_jl = tail call spir_func i32 @_Z10atomic_andPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    130   ; CHECK: _Z25atomic_fetch_and_explicitPVU3AS3U7_Atomiciiii
    131 
    132   ; atomic_cmpxchg
    133   %cmpxchg_il = call spir_func i32 @_Z14atomic_cmpxchgPVU3AS3iii(i32 addrspace(3)* %dst, i32 0, i32 1) #0
    134   ; CHECK: _Z39atomic_compare_exchange_strong_explicitPVU3AS3U7
    135   %cmpxchg_jl = call spir_func i32 @_Z14atomic_cmpxchgPVU3AS3jjj(i32 addrspace(3)* %dst, i32 0, i32 1) #0
    136   ; CHECK: _Z39atomic_compare_exchange_strong_explicitPVU3AS3U7
    137 
    138   ; atomic_xchg
    139   %xchg_il = call spir_func i32 @_Z11atomic_xchgPVU3AS3ii(i32 addrspace(3)* %dst, i32 1) #0
    140   ; CHECK: _Z24atomic_exchange_explicitPVU3AS3U7_Atomiciiii
    141   %xchg_jl = call spir_func i32 @_Z11atomic_xchgPVU3AS3jj(i32 addrspace(3)* %dst, i32 1) #0
    142   ; CHECK: _Z24atomic_exchange_explicitPVU3AS3U7_Atomiciiii
    143 
    144   ret void
    145 }
    146 
    147 ; Function Attrs: nounwind readnone
    148 declare spir_func i32 @_Z10atomic_incPVU3AS1i(i32 addrspace(1)*)
    149 declare spir_func i32 @_Z10atomic_decPVU3AS1j(i32 addrspace(1)*)
    150 declare spir_func i32 @_Z10atomic_maxPVU3AS1ii(i32 addrspace(1)*, i32)
    151 declare spir_func i32 @_Z10atomic_maxPVU3AS1jj(i32 addrspace(1)*, i32)
    152 declare spir_func i32 @_Z10atomic_minPVU3AS1ii(i32 addrspace(1)*, i32)
    153 declare spir_func i32 @_Z10atomic_minPVU3AS1jj(i32 addrspace(1)*, i32)
    154 declare spir_func i32 @_Z10atomic_addPVU3AS1ii(i32 addrspace(1)*, i32)
    155 declare spir_func i32 @_Z10atomic_addPVU3AS1jj(i32 addrspace(1)*, i32)
    156 declare spir_func i32 @_Z10atomic_subPVU3AS1ii(i32 addrspace(1)*, i32)
    157 declare spir_func i32 @_Z10atomic_subPVU3AS1jj(i32 addrspace(1)*, i32)
    158 declare spir_func i32 @_Z9atomic_orPVU3AS1ii(i32 addrspace(1)*, i32)
    159 declare spir_func i32 @_Z9atomic_orPVU3AS1jj(i32 addrspace(1)*, i32)
    160 declare spir_func i32 @_Z10atomic_xorPVU3AS1ii(i32 addrspace(1)*, i32)
    161 declare spir_func i32 @_Z10atomic_xorPVU3AS1jj(i32 addrspace(1)*, i32)
    162 declare spir_func i32 @_Z10atomic_andPVU3AS1ii(i32 addrspace(1)*, i32)
    163 declare spir_func i32 @_Z10atomic_andPVU3AS1jj(i32 addrspace(1)*, i32)
    164 declare spir_func i32 @_Z14atomic_cmpxchgPVU3AS1iii(i32 addrspace(1)*, i32, i32)
    165 declare spir_func i32 @_Z14atomic_cmpxchgPVU3AS1jjj(i32 addrspace(1)*, i32, i32)
    166 declare spir_func i32 @_Z11atomic_xchgPVU3AS1ii(i32 addrspace(1)*, i32)
    167 declare spir_func i32 @_Z11atomic_xchgPVU3AS1jj(i32 addrspace(1)*, i32)
    168 
    169 declare spir_func i32 @_Z10atomic_incPVU3AS3i(i32 addrspace(3)*)
    170 declare spir_func i32 @_Z10atomic_decPVU3AS3j(i32 addrspace(3)*)
    171 declare spir_func i32 @_Z10atomic_maxPVU3AS3ii(i32 addrspace(3)*, i32)
    172 declare spir_func i32 @_Z10atomic_maxPVU3AS3jj(i32 addrspace(3)*, i32)
    173 declare spir_func i32 @_Z10atomic_minPVU3AS3ii(i32 addrspace(3)*, i32)
    174 declare spir_func i32 @_Z10atomic_minPVU3AS3jj(i32 addrspace(3)*, i32)
    175 declare spir_func i32 @_Z10atomic_addPVU3AS3ii(i32 addrspace(3)*, i32)
    176 declare spir_func i32 @_Z10atomic_addPVU3AS3jj(i32 addrspace(3)*, i32)
    177 declare spir_func i32 @_Z10atomic_subPVU3AS3ii(i32 addrspace(3)*, i32)
    178 declare spir_func i32 @_Z10atomic_subPVU3AS3jj(i32 addrspace(3)*, i32)
    179 declare spir_func i32 @_Z9atomic_orPVU3AS3ii(i32 addrspace(3)*, i32)
    180 declare spir_func i32 @_Z9atomic_orPVU3AS3jj(i32 addrspace(3)*, i32)
    181 declare spir_func i32 @_Z10atomic_xorPVU3AS3ii(i32 addrspace(3)*, i32)
    182 declare spir_func i32 @_Z10atomic_xorPVU3AS3jj(i32 addrspace(3)*, i32)
    183 declare spir_func i32 @_Z10atomic_andPVU3AS3ii(i32 addrspace(3)*, i32)
    184 declare spir_func i32 @_Z10atomic_andPVU3AS3jj(i32 addrspace(3)*, i32)
    185 declare spir_func i32 @_Z14atomic_cmpxchgPVU3AS3iii(i32 addrspace(3)*, i32, i32)
    186 declare spir_func i32 @_Z14atomic_cmpxchgPVU3AS3jjj(i32 addrspace(3)*, i32, i32)
    187 declare spir_func i32 @_Z11atomic_xchgPVU3AS3ii(i32 addrspace(3)*, i32)
    188 declare spir_func i32 @_Z11atomic_xchgPVU3AS3jj(i32 addrspace(3)*, i32)
    189 
    190 attributes #0 = { nounwind }
    191 attributes #1 = { nounwind readnone }
    192 
    193 !opencl.kernels = !{!0, !10}
    194 !opencl.enable.FP_CONTRACT = !{}
    195 !opencl.spir.version = !{!7}
    196 !opencl.ocl.version = !{!7}
    197 !opencl.used.extensions = !{!8}
    198 !opencl.used.optional.core.features = !{!8}
    199 !opencl.compiler.options = !{!9}
    200 
    201 !0 = !{void (i32 addrspace(1)*)* @test_atomic_global, !1, !2, !3, !4, !5, !6}
    202 !1 = !{!"kernel_arg_addr_space", i32 1}
    203 !2 = !{!"kernel_arg_access_qual", !"none"}
    204 !3 = !{!"kernel_arg_type", !"int*"}
    205 !4 = !{!"kernel_arg_type_qual", !"volatile"}
    206 !5 = !{!"kernel_arg_base_type", !"int*"}
    207 !6 = !{!"kernel_arg_name", !"dst"}
    208 !7 = !{i32 1, i32 2}
    209 !8 = !{}
    210 !9 = !{!"-cl-kernel-arg-info"}
    211 !10 = !{void (i32 addrspace(3)*)* @test_atomic_local, !11, !2, !3, !4, !5, !6}
    212 !11 = !{!"kernel_arg_addr_space", i32 1}
    213