|
| 1 | +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s |
| 2 | + |
| 3 | +! Test CUDA Fortran procedures available in cudadevice module |
| 4 | + |
| 5 | +attributes(global) subroutine devsub() |
| 6 | + implicit none |
| 7 | + integer :: ret |
| 8 | + |
| 9 | + call syncthreads() |
| 10 | + call syncwarp(1) |
| 11 | + call threadfence() |
| 12 | + call threadfence_block() |
| 13 | + call threadfence_system() |
| 14 | + ret = syncthreads_and(1) |
| 15 | + ret = syncthreads_count(1) |
| 16 | + ret = syncthreads_or(1) |
| 17 | +end |
| 18 | + |
| 19 | +! CHECK-LABEL: func.func @_QPdevsub() attributes {cuf.proc_attr = #cuf.cuda_proc<global>} |
| 20 | +! CHECK: fir.call @__syncthreads() |
| 21 | +! CHECK: fir.call @__syncwarp(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> () |
| 22 | +! CHECK: fir.call @__threadfence() |
| 23 | +! CHECK: fir.call @__threadfence_block() |
| 24 | +! CHECK: fir.call @__threadfence_system() |
| 25 | +! CHECK: %{{.*}} = fir.call @__syncthreads_and(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32 |
| 26 | +! CHECK: %{{.*}} = fir.call @__syncthreads_count(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32 |
| 27 | +! CHECK: %{{.*}} = fir.call @__syncthreads_or(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32 |
| 28 | + |
| 29 | +! CHECK: func.func private @__syncthreads() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads"} |
| 30 | +! CHECK: func.func private @__syncwarp(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncwarp"} |
| 31 | +! CHECK: func.func private @__threadfence() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence"} |
| 32 | +! CHECK: func.func private @__threadfence_block() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence_block"} |
| 33 | +! CHECK: func.func private @__threadfence_system() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence_system"} |
| 34 | +! CHECK: func.func private @__syncthreads_and(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_and"} |
| 35 | +! CHECK: func.func private @__syncthreads_count(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_count"} |
| 36 | +! CHECK: func.func private @__syncthreads_or(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_or"} |
0 commit comments