|
2 | 2 |
|
3 | 3 | ! Test CUDA Fortran specific type |
4 | 4 |
|
| 5 | +module cudafct |
| 6 | + use __fortran_builtins, only : c_devptr => __builtin_c_devptr |
| 7 | +contains |
| 8 | + function c_devloc(x) |
| 9 | + use iso_c_binding, only: c_loc |
| 10 | + type(c_devptr) :: c_devloc |
| 11 | + !dir$ ignore_tkr (tkr) x |
| 12 | + real, target, device :: x |
| 13 | + c_devloc%cptr = c_loc(x) |
| 14 | + end function |
| 15 | +end |
| 16 | + |
5 | 17 | subroutine sub1() |
6 | 18 | use iso_c_binding |
7 | 19 | use __fortran_builtins, only : c_devptr => __builtin_c_devptr |
|
14 | 26 |
|
15 | 27 | ! CHECK-LABEL: func.func @_QPsub1() |
16 | 28 | ! CHECK-COUNT-2: %{{.*}} = fir.call @_FortranAioOutputDerivedType |
| 29 | + |
| 30 | +subroutine sub2() |
| 31 | + use cudafct |
| 32 | + use iso_c_binding, only: c_f_pointer |
| 33 | + |
| 34 | + real(4), device :: a(8, 10) |
| 35 | + real(4), device, pointer :: x(:) |
| 36 | + call c_f_pointer(c_devloc(a), x, (/80/)) |
| 37 | +end |
| 38 | + |
| 39 | +! CHECK-LABEL: func.func @_QPsub2() |
| 40 | +! CHECK: %[[X:.*]]:2 = hlfir.declare %{{.*}} {data_attr = #cuf.cuda<device>, fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFsub2Ex"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) |
| 41 | +! CHECK: %[[CPTR:.*]] = fir.field_index cptr, !fir.type<_QM__fortran_builtinsT__builtin_c_devptr{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}> |
| 42 | +! CHECK: %[[CPTR_COORD:.*]] = fir.coordinate_of %{{.*}}#1, %[[CPTR]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_devptr{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>, !fir.field) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>> |
| 43 | +! CHECK: %[[CPTR_LOAD:.*]] = fir.load %[[CPTR_COORD]] : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>> |
| 44 | +! CHECK: %[[ADDRESS:.*]] = fir.extract_value %[[CPTR_LOAD]], [0 : index] : (!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>) -> i64 |
| 45 | +! CHECK: %[[ADDRESS_IDX:.*]] = fir.convert %[[ADDRESS]] : (i64) -> !fir.ptr<!fir.array<?xf32>> |
| 46 | +! CHECK: %[[EMBOX:.*]] = fir.embox %[[ADDRESS_IDX]](%{{.*}}) : (!fir.ptr<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>> |
| 47 | +! CHECK: fir.store %[[EMBOX]] to %[[X]]#1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> |
0 commit comments