! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s subroutine associated_stream use cuda_runtime_api integer(kind=cuda_stream_kind) :: strm, strmout integer, managed, allocatable :: v(:) integer :: istat istat = cudaforSetDefaultStream(v, strm) strmout = cudaforGetDefaultStream(v) end subroutine ! CHECK-LABEL: func.func @_QPassociated_stream() ! CHECK: %[[ADDR:.*]] = fir.box_addr %{{.*}} : (!fir.box>>) -> !fir.heap> ! CHECK: %[[STREAM:.*]] = fir.load %{{.*}}#0 : !fir.ref ! CHECK: %[[VOIDPTR:.*]] = fir.convert %[[ADDR]] : (!fir.heap>) -> !fir.llvm_ptr ! CHECK: %[[STAT:.*]] = fir.call @_FortranACUFSetAssociatedStream(%[[VOIDPTR]], %[[STREAM]]) fastmath : (!fir.llvm_ptr, i64) -> i32 ! CHECK: hlfir.assign %[[STAT]] to %{{.*}}#0 : i32, !fir.ref ! CHECK: %[[ADDR:.*]] = fir.box_addr %{{.*}} : (!fir.box>>) -> !fir.heap> ! CHECK: %[[VOIDPTR:.*]] = fir.convert %[[ADDR]] : (!fir.heap>) -> !fir.llvm_ptr ! CHECK: %[[STREAM:.*]] = fir.call @_FortranACUFGetAssociatedStream(%[[VOIDPTR]]) fastmath : (!fir.llvm_ptr) -> i64 ! CHECK: hlfir.assign %[[STREAM]] to %{{.*}}#0 : i64, !fir.ref subroutine default_stream use cuda_runtime_api integer(kind=cuda_stream_kind) :: strm, strm2 integer :: istat istat = cudaStreamCreate(strm2) istat = cudaforSetDefaultStream(strm2) strm = cudaforGetDefaultStream() istat = cudaStreamSynchronize(cudaforGetDefaultStream()) end subroutine ! CHECK-LABEL: func.func @_QPdefault_stream() ! CHECK: %{{.*}} = fir.call @_FortranACUFSetDefaultStream(%{{.*}}) fastmath : (i64) -> i32 ! CHECK: %{{.*}} = fir.call @_FortranACUFGetDefaultStream() fastmath : () -> i64 ! CHECK: %{{.*}} = fir.call @_FortranACUFGetDefaultStream() fastmath : () -> i64 subroutine stream_destroy use cuda_runtime_api integer(kind=cuda_stream_kind) :: strm integer :: istat istat = cudaStreamCreate(strm) istat = cudaStreamDestroy(strm) end subroutine ! CHECK-LABEL: func.func @_QPstream_destroy() ! CHECK: %{{.*}} = fir.call @_FortranACUFStreamDestroy(%{{.*}}) fastmath : (i64) -> i32 ! A default-kind (i32) actual argument must be widened to i64 before ! reaching the runtime stream call. subroutine default_stream_i32_literal use cuda_runtime_api integer :: istat istat = cudaforSetDefaultStream(0) istat = cudaStreamDestroy(0) end subroutine ! CHECK-LABEL: func.func @_QPdefault_stream_i32_literal() ! CHECK: %[[ZERO1:.*]] = arith.constant 0 : i32 ! CHECK: %[[STRM1:.*]] = fir.convert %[[ZERO1]] : (i32) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranACUFSetDefaultStream(%[[STRM1]]) fastmath : (i64) -> i32 ! CHECK: %[[ZERO2:.*]] = arith.constant 0 : i32 ! CHECK: %[[STRM2:.*]] = fir.convert %[[ZERO2]] : (i32) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranACUFStreamDestroy(%[[STRM2]]) fastmath : (i64) -> i32 subroutine default_stream_i32_var use cuda_runtime_api integer :: istat integer(4) :: s s = 0 istat = cudaforSetDefaultStream(s) istat = cudaStreamDestroy(s) end subroutine ! CHECK-LABEL: func.func @_QPdefault_stream_i32_var() ! CHECK: %[[L1:.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: %[[V1:.*]] = fir.convert %[[L1]] : (i32) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranACUFSetDefaultStream(%[[V1]]) fastmath : (i64) -> i32 ! CHECK: %[[L2:.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: %[[V2:.*]] = fir.convert %[[L2]] : (i32) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranACUFStreamDestroy(%[[V2]]) fastmath : (i64) -> i32