xref: /llvm-project/flang/test/Lower/transformational-intrinsics.f90 (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
165cb2e1eSValentin Clement! Test how transformational intrinsic function references are lowered
265cb2e1eSValentin Clement
3f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
465cb2e1eSValentin Clement
565cb2e1eSValentin Clement! The exact intrinsic being tested does not really matter, what is
665cb2e1eSValentin Clement! tested here is that transformational intrinsics are lowered correctly
765cb2e1eSValentin Clement! regardless of the context they appear into.
865cb2e1eSValentin Clement
965cb2e1eSValentin Clement
1065cb2e1eSValentin Clement
1165cb2e1eSValentin Clementmodule test2
1265cb2e1eSValentin Clementinterface
1365cb2e1eSValentin Clement  subroutine takes_array_desc(l)
1465cb2e1eSValentin Clement    logical(1) :: l(:)
1565cb2e1eSValentin Clement  end subroutine
1665cb2e1eSValentin Clementend interface
1765cb2e1eSValentin Clement
1865cb2e1eSValentin Clementcontains
1965cb2e1eSValentin Clement
2065cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Pin_io(
2165cb2e1eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<1>>>{{.*}}) {
2265cb2e1eSValentin Clementsubroutine in_io(x)
2365cb2e1eSValentin Clement  logical(1) :: x(:, :)
2465cb2e1eSValentin Clement  ! CHECK: %[[res_desc:.]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>
2565cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_arg:.*]] = fir.convert %[[res_desc]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>) -> !fir.ref<!fir.box<none>>
2665cb2e1eSValentin Clement  ! CHECK-DAG: %[[x_arg:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x!fir.logical<1>>>) -> !fir.box<none>
27*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK: fir.call @_Fortran{{.*}}AllDim(%[[res_arg]], %[[x_arg]], {{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
2865cb2e1eSValentin Clement  ! CHECK: %[[res_desc_load:.*]] = fir.load %[[res_desc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>
2965cb2e1eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[res_desc_load]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>, index) -> (index, index, index)
3065cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_addr:.*]] = fir.box_addr %[[res_desc_load]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>) -> !fir.heap<!fir.array<?x!fir.logical<1>>>
3165cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_shape:.*]] = fir.shape_shift %[[dims]]#0, %[[dims]]#1 : (index, index) -> !fir.shapeshift<1>
3265cb2e1eSValentin Clement  ! CHECK: %[[io_embox:.*]] = fir.embox %[[res_addr]](%[[res_shape]]) : (!fir.heap<!fir.array<?x!fir.logical<1>>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<?x!fir.logical<1>>>
3365cb2e1eSValentin Clement  ! CHECK: %[[io_embox_cast:.*]] = fir.convert %[[io_embox]] : (!fir.box<!fir.array<?x!fir.logical<1>>>) -> !fir.box<none>
344cc9437aSTom Eccles  ! CHECK: fir.call @_Fortran{{.*}}ioOutputDescriptor({{.*}}, %[[io_embox_cast]]) {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
3565cb2e1eSValentin Clement  print *, all(x, 1)
363348c083SValentin Clement  ! CHECK: fir.freemem %[[res_addr]] : !fir.heap<!fir.array<?x!fir.logical<1>>>
3765cb2e1eSValentin Clementend subroutine
3865cb2e1eSValentin Clement
3965cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Pin_call(
4065cb2e1eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<1>>>{{.*}}) {
4165cb2e1eSValentin Clementsubroutine in_call(x)
4265cb2e1eSValentin Clement  implicit none
4365cb2e1eSValentin Clement  logical(1) :: x(:, :)
4465cb2e1eSValentin Clement  ! CHECK: %[[res_desc:.]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>
4565cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_arg:.*]] = fir.convert %[[res_desc]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>) -> !fir.ref<!fir.box<none>>
4665cb2e1eSValentin Clement  ! CHECK-DAG: %[[x_arg:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x!fir.logical<1>>>) -> !fir.box<none>
47*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK: fir.call @_Fortran{{.*}}AllDim(%[[res_arg]], %[[x_arg]], {{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
4865cb2e1eSValentin Clement  ! CHECK: %[[res_desc_load:.*]] = fir.load %[[res_desc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>
4965cb2e1eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[res_desc_load]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>, index) -> (index, index, index)
5065cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_addr:.*]] = fir.box_addr %[[res_desc_load]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>) -> !fir.heap<!fir.array<?x!fir.logical<1>>>
5165cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_shape:.*]] = fir.shape_shift %[[dims]]#0, %[[dims]]#1 : (index, index) -> !fir.shapeshift<1>
5265cb2e1eSValentin Clement  ! CHECK: %[[call_embox:.*]] = fir.embox %[[res_addr]](%[[res_shape]]) : (!fir.heap<!fir.array<?x!fir.logical<1>>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<?x!fir.logical<1>>>
534cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_array_desc(%[[call_embox]]) {{.*}}: (!fir.box<!fir.array<?x!fir.logical<1>>>) -> ()
5465cb2e1eSValentin Clement  call takes_array_desc(all(x, 1))
553348c083SValentin Clement  ! CHECK: fir.freemem %[[res_addr]] : !fir.heap<!fir.array<?x!fir.logical<1>>>
5665cb2e1eSValentin Clementend subroutine
5765cb2e1eSValentin Clement
5865cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Pin_implicit_call(
5965cb2e1eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<1>>>{{.*}}) {
6065cb2e1eSValentin Clementsubroutine in_implicit_call(x)
6165cb2e1eSValentin Clement  logical(1) :: x(:, :)
6265cb2e1eSValentin Clement  ! CHECK: %[[res_desc:.]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>
6365cb2e1eSValentin Clement  ! CHECK: fir.call @_Fortran{{.*}}AllDim
6465cb2e1eSValentin Clement  ! CHECK: %[[res_desc_load:.*]] = fir.load %[[res_desc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>
6565cb2e1eSValentin Clement  ! CHECK: %[[res_addr:.*]] = fir.box_addr %[[res_desc_load]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>) -> !fir.heap<!fir.array<?x!fir.logical<1>>>
6665cb2e1eSValentin Clement  ! CHECK: %[[res_addr_cast:.*]] = fir.convert %[[res_addr]] : (!fir.heap<!fir.array<?x!fir.logical<1>>>) -> !fir.ref<!fir.array<?x!fir.logical<1>>>
674cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_implicit_array(%[[res_addr_cast]]) {{.*}}: (!fir.ref<!fir.array<?x!fir.logical<1>>>) -> ()
6865cb2e1eSValentin Clement  call takes_implicit_array(all(x, 1))
693348c083SValentin Clement  ! CHECK: fir.freemem %[[res_addr]] : !fir.heap<!fir.array<?x!fir.logical<1>>>
7065cb2e1eSValentin Clementend subroutine
7165cb2e1eSValentin Clement
7265cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Pin_assignment(
7365cb2e1eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<1>>>{{.*}}, %[[arg1:.*]]: !fir.box<!fir.array<?x!fir.logical<1>>>{{.*}})
7465cb2e1eSValentin Clementsubroutine in_assignment(x, y)
7565cb2e1eSValentin Clement  logical(1) :: x(:, :), y(:)
7665cb2e1eSValentin Clement  ! CHECK: %[[res_desc:.]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>
7765cb2e1eSValentin Clement  ! CHECK: %[[y_load:.*]] = fir.array_load %[[arg1]] : (!fir.box<!fir.array<?x!fir.logical<1>>>) -> !fir.array<?x!fir.logical<1>>
7865cb2e1eSValentin Clement  ! CHECK: fir.call @_Fortran{{.*}}AllDim
7965cb2e1eSValentin Clement
8065cb2e1eSValentin Clement  ! CHECK: %[[res_desc_load:.*]] = fir.load %[[res_desc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>
8165cb2e1eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[res_desc_load]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>, index) -> (index, index, index)
8265cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_addr:.*]] = fir.box_addr %[[res_desc_load]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>) -> !fir.heap<!fir.array<?x!fir.logical<1>>>
8365cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_shape:.*]] = fir.shape_shift %[[dims]]#0, %[[dims]]#1 : (index, index) -> !fir.shapeshift<1>
8465cb2e1eSValentin Clement  ! CHECK: %[[res_load:.*]] = fir.array_load %[[res_addr]](%[[res_shape]]) : (!fir.heap<!fir.array<?x!fir.logical<1>>>, !fir.shapeshift<1>) -> !fir.array<?x!fir.logical<1>>
8565cb2e1eSValentin Clement
8665cb2e1eSValentin Clement  ! CHECK: %[[assign:.*]] = fir.do_loop %[[idx:.*]] = %{{.*}} to {{.*}} {
8765cb2e1eSValentin Clement    ! CHECK: %[[res_elt:.*]] = fir.array_fetch %[[res_load]], %[[idx]] : (!fir.array<?x!fir.logical<1>>, index) -> !fir.logical<1>
8865cb2e1eSValentin Clement    ! CHECK: fir.array_update %{{.*}} %[[res_elt]], %[[idx]] : (!fir.array<?x!fir.logical<1>>, !fir.logical<1>, index) -> !fir.array<?x!fir.logical<1>>
8965cb2e1eSValentin Clement  ! CHECK: }
9065cb2e1eSValentin Clement  ! CHECK: fir.array_merge_store %[[y_load]], %[[assign]] to %[[arg1]] : !fir.array<?x!fir.logical<1>>, !fir.array<?x!fir.logical<1>>, !fir.box<!fir.array<?x!fir.logical<1>>>
9165cb2e1eSValentin Clement  y = all(x, 1)
923348c083SValentin Clement  ! CHECK: fir.freemem %[[res_addr]] : !fir.heap<!fir.array<?x!fir.logical<1>>>
9365cb2e1eSValentin Clementend subroutine
9465cb2e1eSValentin Clement
9565cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Pin_elem_expr(
9665cb2e1eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<1>>>{{.*}}, %[[arg1:.*]]: !fir.box<!fir.array<?x!fir.logical<1>>>{{.*}}, %[[arg2:.*]]: !fir.box<!fir.array<?x!fir.logical<1>>>{{.*}})
9765cb2e1eSValentin Clementsubroutine in_elem_expr(x, y, z)
9865cb2e1eSValentin Clement  logical(1) :: x(:, :), y(:), z(:)
9965cb2e1eSValentin Clement  ! CHECK: %[[res_desc:.]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>
10065cb2e1eSValentin Clement  ! CHECK-DAG: %[[y_load:.*]] = fir.array_load %[[arg1]] : (!fir.box<!fir.array<?x!fir.logical<1>>>) -> !fir.array<?x!fir.logical<1>>
10165cb2e1eSValentin Clement  ! CHECK-DAG: %[[z_load:.*]] = fir.array_load %[[arg2]] : (!fir.box<!fir.array<?x!fir.logical<1>>>) -> !fir.array<?x!fir.logical<1>>
10265cb2e1eSValentin Clement  ! CHECK: fir.call @_Fortran{{.*}}AllDim
10365cb2e1eSValentin Clement
10465cb2e1eSValentin Clement  ! CHECK: %[[res_desc_load:.*]] = fir.load %[[res_desc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>>
10565cb2e1eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[res_desc_load]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>, index) -> (index, index, index)
10665cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_addr:.*]] = fir.box_addr %[[res_desc_load]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<1>>>>) -> !fir.heap<!fir.array<?x!fir.logical<1>>>
10765cb2e1eSValentin Clement  ! CHECK-DAG: %[[res_shape:.*]] = fir.shape_shift %[[dims]]#0, %[[dims]]#1 : (index, index) -> !fir.shapeshift<1>
10865cb2e1eSValentin Clement  ! CHECK: %[[res_load:.*]] = fir.array_load %[[res_addr]](%[[res_shape]]) : (!fir.heap<!fir.array<?x!fir.logical<1>>>, !fir.shapeshift<1>) -> !fir.array<?x!fir.logical<1>>
10965cb2e1eSValentin Clement
11065cb2e1eSValentin Clement  ! CHECK: %[[elem_expr:.*]] = fir.do_loop %[[idx:.*]] = %{{.*}} to {{.*}} {
11165cb2e1eSValentin Clement    ! CHECK-DAG: %[[y_elt:.*]] = fir.array_fetch %[[y_load]], %[[idx]] : (!fir.array<?x!fir.logical<1>>, index) -> !fir.logical<1>
11265cb2e1eSValentin Clement    ! CHECK-DAG: %[[res_elt:.*]] = fir.array_fetch %[[res_load]], %[[idx]] : (!fir.array<?x!fir.logical<1>>, index) -> !fir.logical<1>
11365cb2e1eSValentin Clement    ! CHECK-DAG: %[[y_elt_i1:.*]] = fir.convert %[[y_elt]] : (!fir.logical<1>) -> i1
11465cb2e1eSValentin Clement    ! CHECK-DAG: %[[res_elt_i1:.*]] = fir.convert %[[res_elt]] : (!fir.logical<1>) -> i1
11565cb2e1eSValentin Clement    ! CHECK: %[[neqv_i1:.*]] = arith.cmpi ne, %[[y_elt_i1]], %[[res_elt_i1]] : i1
11665cb2e1eSValentin Clement    ! CHECK: %[[neqv:.*]] = fir.convert %[[neqv_i1]] : (i1) -> !fir.logical<1>
11765cb2e1eSValentin Clement    ! CHECK: fir.array_update %{{.*}} %[[neqv]], %[[idx]] : (!fir.array<?x!fir.logical<1>>, !fir.logical<1>, index) -> !fir.array<?x!fir.logical<1>>
11865cb2e1eSValentin Clement  ! CHECK: }
11965cb2e1eSValentin Clement  ! CHECK: fir.array_merge_store %[[z_load]], %[[elem_expr]] to %[[arg2]] : !fir.array<?x!fir.logical<1>>, !fir.array<?x!fir.logical<1>>, !fir.box<!fir.array<?x!fir.logical<1>>>
12065cb2e1eSValentin Clement  z = y .neqv. all(x, 1)
1213348c083SValentin Clement  ! CHECK: fir.freemem %[[res_addr]] : !fir.heap<!fir.array<?x!fir.logical<1>>>
12265cb2e1eSValentin Clementend subroutine
12365cb2e1eSValentin Clement
12465cb2e1eSValentin Clement! CSHIFT
12565cb2e1eSValentin Clement
12665cb2e1eSValentin Clement  ! CHECK-LABEL: func @_QMtest2Pcshift_test() {
12765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
12865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_1:.*]] = fir.alloca i32
12965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xi32>>>
13065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_3:.*]] = arith.constant 3 : index
13165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_4:.*]] = arith.constant 3 : index
13265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_5:.*]] = fir.alloca !fir.array<3x3xi32> {bindc_name = "array", uniq_name = "_QMtest2Fcshift_testEarray"}
13365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_6:.*]] = arith.constant 3 : index
13465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_7:.*]] = arith.constant 3 : index
13565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_8:.*]] = fir.alloca !fir.array<3x3xi32> {bindc_name = "result", uniq_name = "_QMtest2Fcshift_testEresult"}
13665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_9:.*]] = arith.constant 3 : index
13765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_10:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "shift", uniq_name = "_QMtest2Fcshift_testEshift"}
13865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_11:.*]] = arith.constant 6 : index
13965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_12:.*]] = fir.alloca !fir.array<6xi32> {bindc_name = "vector", uniq_name = "_QMtest2Fcshift_testEvector"}
14065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_13:.*]] = arith.constant 6 : index
14165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_14:.*]] = fir.alloca !fir.array<6xi32> {bindc_name = "vectorresult", uniq_name = "_QMtest2Fcshift_testEvectorresult"}
14265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_15:.*]] = fir.shape %[[VAL_6]], %[[VAL_7]] : (index, index) -> !fir.shape<2>
14365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_16:.*]] = fir.array_load %[[VAL_8]](%[[VAL_15]]) : (!fir.ref<!fir.array<3x3xi32>>, !fir.shape<2>) -> !fir.array<3x3xi32>
144af54b676SPeter Klausler  ! CHECK:         %[[VAL_17:.*]] = arith.constant 2 : i32
14565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_18:.*]] = fir.shape %[[VAL_3]], %[[VAL_4]] : (index, index) -> !fir.shape<2>
14665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_19:.*]] = fir.embox %[[VAL_5]](%[[VAL_18]]) : (!fir.ref<!fir.array<3x3xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<3x3xi32>>
14765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_20:.*]] = fir.zero_bits !fir.heap<!fir.array<?x?xi32>>
14865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_21:.*]] = arith.constant 0 : index
14965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_22:.*]] = fir.shape %[[VAL_21]], %[[VAL_21]] : (index, index) -> !fir.shape<2>
15065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_23:.*]] = fir.embox %[[VAL_20]](%[[VAL_22]]) : (!fir.heap<!fir.array<?x?xi32>>, !fir.shape<2>) -> !fir.box<!fir.heap<!fir.array<?x?xi32>>>
15165cb2e1eSValentin Clement  ! CHECK:         fir.store %[[VAL_23]] to %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
15265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_24:.*]] = fir.shape %[[VAL_9]] : (index) -> !fir.shape<1>
15365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_25:.*]] = fir.embox %[[VAL_10]](%[[VAL_24]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
15465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_26:.*]] = fir.address_of(@_QQcl{{.*}}) : !fir.ref<!fir.char<1,
15565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_27:.*]] = arith.constant {{[0-9]+}} : i32
15665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_28:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>) -> !fir.ref<!fir.box<none>>
15765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_29:.*]] = fir.convert %[[VAL_19]] : (!fir.box<!fir.array<3x3xi32>>) -> !fir.box<none>
15865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_30:.*]] = fir.convert %[[VAL_25]] : (!fir.box<!fir.array<3xi32>>) -> !fir.box<none>
15965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_31:.*]] = fir.convert %[[VAL_26]] : (!fir.ref<!fir.char<1,{{[0-9]+}}>>) -> !fir.ref<i8>
160*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK:         fir.call @_FortranACshift(%[[VAL_28]], %[[VAL_29]], %[[VAL_30]], %[[VAL_17]], %[[VAL_31]], %[[VAL_27]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
16165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_33:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
16265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_34:.*]] = arith.constant 0 : index
16365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_35:.*]]:3 = fir.box_dims %[[VAL_33]], %[[VAL_34]] : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>, index) -> (index, index, index)
16465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_36:.*]] = arith.constant 1 : index
16565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_37:.*]]:3 = fir.box_dims %[[VAL_33]], %[[VAL_36]] : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>, index) -> (index, index, index)
16665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_38:.*]] = fir.box_addr %[[VAL_33]] : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>) -> !fir.heap<!fir.array<?x?xi32>>
16765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_39:.*]] = fir.shape_shift %[[VAL_35]]#0, %[[VAL_35]]#1, %[[VAL_37]]#0, %[[VAL_37]]#1 : (index, index, index, index) -> !fir.shapeshift<2>
16865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_40:.*]] = fir.array_load %[[VAL_38]](%[[VAL_39]]) : (!fir.heap<!fir.array<?x?xi32>>, !fir.shapeshift<2>) -> !fir.array<?x?xi32>
16965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_41:.*]] = arith.constant 1 : index
17065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_42:.*]] = arith.constant 0 : index
17165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_43:.*]] = arith.subi %[[VAL_6]], %[[VAL_41]] : index
17265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_44:.*]] = arith.subi %[[VAL_7]], %[[VAL_41]] : index
17365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_45:.*]] = fir.do_loop %[[VAL_46:.*]] = %[[VAL_42]] to %[[VAL_44]] step %[[VAL_41]] unordered iter_args(%[[VAL_47:.*]] = %[[VAL_16]]) -> (!fir.array<3x3xi32>) {
17465cb2e1eSValentin Clement  ! CHECK:           %[[VAL_48:.*]] = fir.do_loop %[[VAL_49:.*]] = %[[VAL_42]] to %[[VAL_43]] step %[[VAL_41]] unordered iter_args(%[[VAL_50:.*]] = %[[VAL_47]]) -> (!fir.array<3x3xi32>) {
17565cb2e1eSValentin Clement  ! CHECK:             %[[VAL_51:.*]] = fir.array_fetch %[[VAL_40]], %[[VAL_49]], %[[VAL_46]] : (!fir.array<?x?xi32>, index, index) -> i32
17665cb2e1eSValentin Clement  ! CHECK:             %[[VAL_52:.*]] = fir.array_update %[[VAL_50]], %[[VAL_51]], %[[VAL_49]], %[[VAL_46]] : (!fir.array<3x3xi32>, i32, index, index) -> !fir.array<3x3xi32>
17765cb2e1eSValentin Clement  ! CHECK:             fir.result %[[VAL_52]] : !fir.array<3x3xi32>
17865cb2e1eSValentin Clement  ! CHECK:           }
17965cb2e1eSValentin Clement  ! CHECK:           fir.result %[[VAL_53:.*]] : !fir.array<3x3xi32>
18065cb2e1eSValentin Clement  ! CHECK:         }
18165cb2e1eSValentin Clement  ! CHECK:         fir.array_merge_store %[[VAL_16]], %[[VAL_54:.*]] to %[[VAL_8]] : !fir.array<3x3xi32>, !fir.array<3x3xi32>, !fir.ref<!fir.array<3x3xi32>>
1823348c083SValentin Clement  ! CHECK:         fir.freemem %[[VAL_38]] : !fir.heap<!fir.array<?x?xi32>>
18365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_55:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1>
18465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_56:.*]] = fir.array_load %[[VAL_14]](%[[VAL_55]]) : (!fir.ref<!fir.array<6xi32>>, !fir.shape<1>) -> !fir.array<6xi32>
18565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_57:.*]] = arith.constant 3 : i32
18665cb2e1eSValentin Clement  ! CHECK:         fir.store %[[VAL_57]] to %[[VAL_1]] : !fir.ref<i32>
18765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_58:.*]] = fir.shape %[[VAL_11]] : (index) -> !fir.shape<1>
18865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_59:.*]] = fir.embox %[[VAL_12]](%[[VAL_58]]) : (!fir.ref<!fir.array<6xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<6xi32>>
18965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_60:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
19065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_61:.*]] = arith.constant 0 : index
19165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_62:.*]] = fir.shape %[[VAL_61]] : (index) -> !fir.shape<1>
19265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_63:.*]] = fir.embox %[[VAL_60]](%[[VAL_62]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
19365cb2e1eSValentin Clement  ! CHECK:         fir.store %[[VAL_63]] to %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
19465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_64:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
195fd389f46SFabian Mora  ! CHECK:         %[[VAL_65:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,
19665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_66:.*]] = arith.constant {{[0-9]+}} : i32
19765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_67:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
19865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_68:.*]] = fir.convert %[[VAL_59]] : (!fir.box<!fir.array<6xi32>>) -> !fir.box<none>
19965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_69:.*]] = fir.convert %[[VAL_64]] : (i32) -> i64
20065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_70:.*]] = fir.convert %[[VAL_65]] : (!fir.ref<!fir.char<1,{{[0-9]+}}>>) -> !fir.ref<i8>
201*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK:         fir.call @_FortranACshiftVector(%[[VAL_67]], %[[VAL_68]], %[[VAL_69]], %[[VAL_70]], %[[VAL_66]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, i64, !fir.ref<i8>, i32) -> ()
20265cb2e1eSValentin Clement  ! CHECK:         %[[VAL_72:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
20365cb2e1eSValentin Clement  ! CHECK:         %[[VAL_73:.*]] = arith.constant 0 : index
20465cb2e1eSValentin Clement  ! CHECK:         %[[VAL_74:.*]]:3 = fir.box_dims %[[VAL_72]], %[[VAL_73]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)
20565cb2e1eSValentin Clement  ! CHECK:         %[[VAL_75:.*]] = fir.box_addr %[[VAL_72]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
20665cb2e1eSValentin Clement  ! CHECK:         %[[VAL_76:.*]] = fir.shape_shift %[[VAL_74]]#0, %[[VAL_74]]#1 : (index, index) -> !fir.shapeshift<1>
20765cb2e1eSValentin Clement  ! CHECK:         %[[VAL_77:.*]] = fir.array_load %[[VAL_75]](%[[VAL_76]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.array<?xi32>
20865cb2e1eSValentin Clement  ! CHECK:         %[[VAL_78:.*]] = arith.constant 1 : index
20965cb2e1eSValentin Clement  ! CHECK:         %[[VAL_79:.*]] = arith.constant 0 : index
21065cb2e1eSValentin Clement  ! CHECK:         %[[VAL_80:.*]] = arith.subi %[[VAL_13]], %[[VAL_78]] : index
21165cb2e1eSValentin Clement  ! CHECK:         %[[VAL_81:.*]] = fir.do_loop %[[VAL_82:.*]] = %[[VAL_79]] to %[[VAL_80]] step %[[VAL_78]] unordered iter_args(%[[VAL_83:.*]] = %[[VAL_56]]) -> (!fir.array<6xi32>) {
21265cb2e1eSValentin Clement  ! CHECK:           %[[VAL_84:.*]] = fir.array_fetch %[[VAL_77]], %[[VAL_82]] : (!fir.array<?xi32>, index) -> i32
21365cb2e1eSValentin Clement  ! CHECK:           %[[VAL_85:.*]] = fir.array_update %[[VAL_83]], %[[VAL_84]], %[[VAL_82]] : (!fir.array<6xi32>, i32, index) -> !fir.array<6xi32>
21465cb2e1eSValentin Clement  ! CHECK:           fir.result %[[VAL_85]] : !fir.array<6xi32>
21565cb2e1eSValentin Clement  ! CHECK:         }
21665cb2e1eSValentin Clement  ! CHECK:         fir.array_merge_store %[[VAL_56]], %[[VAL_86:.*]] to %[[VAL_14]] : !fir.array<6xi32>, !fir.array<6xi32>, !fir.ref<!fir.array<6xi32>>
2173348c083SValentin Clement  ! CHECK:         fir.freemem %[[VAL_75]] : !fir.heap<!fir.array<?xi32>>
21865cb2e1eSValentin Clement  ! CHECK:         return
21965cb2e1eSValentin Clement  ! CHECK:       }
22065cb2e1eSValentin Clement
22165cb2e1eSValentin Clementsubroutine cshift_test()
22265cb2e1eSValentin Clement  integer, dimension (3, 3) :: array
22365cb2e1eSValentin Clement  integer, dimension(3) :: shift
22465cb2e1eSValentin Clement  integer, dimension(3, 3) :: result
22565cb2e1eSValentin Clement  integer, dimension(6) :: vectorResult
22665cb2e1eSValentin Clement  integer, dimension (6) :: vector
227af54b676SPeter Klausler  result = cshift(array, shift, 2) ! non-vector case
22865cb2e1eSValentin Clement  vectorResult = cshift(vector, 3) ! vector case
22965cb2e1eSValentin Clementend subroutine cshift_test
23065cb2e1eSValentin Clement
23165cb2e1eSValentin Clement! UNPACK
23265cb2e1eSValentin Clement! CHECK-LABEL: func @_QMtest2Punpack_test
23365cb2e1eSValentin Clementsubroutine unpack_test()
23465cb2e1eSValentin Clement  integer, dimension(3) :: vector
23565cb2e1eSValentin Clement  integer, dimension (3,3) :: field
23665cb2e1eSValentin Clement
23765cb2e1eSValentin Clement  logical, dimension(3,3) :: mask
23865cb2e1eSValentin Clement  integer, dimension(3,3) :: result
23965cb2e1eSValentin Clement  result = unpack(vector, mask, field)
24065cb2e1eSValentin Clement  ! CHECK-DAG: %[[a0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xi32>>>
24165cb2e1eSValentin Clement  ! CHECK-DAG: %[[a1:.*]] = fir.alloca i32
24265cb2e1eSValentin Clement  ! CHECK-DAG: %[[a2:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xi32>>>
24365cb2e1eSValentin Clement  ! CHECK-DAG: %[[a3:.*]] = fir.alloca !fir.array<3x3xi32> {bindc_name = "field", uniq_name = "_QMtest2Funpack_testEfield"}
24465cb2e1eSValentin Clement  ! CHECK-DAG: %[[a4:.*]] = fir.alloca !fir.array<3x3x!fir.logical<4>> {bindc_name = "mask", uniq_name = "_QMtest2Funpack_testEmask"}
24565cb2e1eSValentin Clement  ! CHECK-DAG: %[[a5:.*]] = fir.alloca !fir.array<3x3xi32> {bindc_name = "result", uniq_name = "_QMtest2Funpack_testEresult"}
24665cb2e1eSValentin Clement  ! CHECK-DAG: %[[a6:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "vector", uniq_name = "_QMtest2Funpack_testEvector"}
24765cb2e1eSValentin Clement  ! CHECK: %[[a7:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
24865cb2e1eSValentin Clement  ! CHECK-NEXT: %[[a8:.*]] = fir.array_load %[[a5]](%[[a7]]) : (!fir.ref<!fir.array<3x3xi32>>, !fir.shape<2>) -> !fir.array<3x3xi32>
24965cb2e1eSValentin Clement  ! CHECK: %[[a9:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
25065cb2e1eSValentin Clement  ! CHECK: %[[a10:.*]] = fir.embox %[[a6]](%[[a9]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
25165cb2e1eSValentin Clement  ! CHECK: %[[a11:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
25265cb2e1eSValentin Clement  ! CHECK: %[[a12:.*]] = fir.embox %[[a4]](%[[a11]]) : (!fir.ref<!fir.array<3x3x!fir.logical<4>>>, !fir.shape<2>) -> !fir.box<!fir.array<3x3x!fir.logical<4>>>
25365cb2e1eSValentin Clement  ! CHECK: %[[a13:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
25465cb2e1eSValentin Clement  ! CHECK-NEXT: %[[a14:.*]] = fir.embox %[[a3]](%[[a13]]) : (!fir.ref<!fir.array<3x3xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<3x3xi32>>
25565cb2e1eSValentin Clement  ! CHECK: %[[a15:.*]] = fir.zero_bits !fir.heap<!fir.array<?x?xi32>>
25665cb2e1eSValentin Clement  ! CHECK: %[[a16:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
25765cb2e1eSValentin Clement  ! CHECK: %[[a17:.*]] = fir.embox %[[a15]](%[[a16]]) : (!fir.heap<!fir.array<?x?xi32>>, !fir.shape<2>) -> !fir.box<!fir.heap<!fir.array<?x?xi32>>>
25865cb2e1eSValentin Clement  ! CHECK-NEXT: fir.store %[[a17]] to %[[a2]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
25965cb2e1eSValentin Clement  ! CHECK-DAG: %[[a19:.*]] = fir.convert %[[a2]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>) -> !fir.ref<!fir.box<none>>
26065cb2e1eSValentin Clement  ! CHECK-DAG: %[[a20:.*]] = fir.convert %[[a10]] : (!fir.box<!fir.array<3xi32>>) -> !fir.box<none>
26165cb2e1eSValentin Clement  ! CHECK-DAG: %[[a21:.*]] = fir.convert %[[a12]] : (!fir.box<!fir.array<3x3x!fir.logical<4>>>) -> !fir.box<none>
26265cb2e1eSValentin Clement  ! CHECK-DAG: %[[a22:.*]] = fir.convert %[[a14]] : (!fir.box<!fir.array<3x3xi32>>) -> !fir.box<none>
263*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK: fir.call @_FortranAUnpack(%[[a19]], %[[a20]], %[[a21]], %[[a22]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) -> ()
26465cb2e1eSValentin Clement  ! CHECK-NEXT: %[[a22:.*]] = fir.load %{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
26565cb2e1eSValentin Clement  ! CHECK: %[[a25:.*]] = fir.box_addr %[[a22]] : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>) -> !fir.heap<!fir.array<?x?xi32>>
2663348c083SValentin Clement  ! CHECK: fir.freemem %[[a25]] : !fir.heap<!fir.array<?x?xi32>>
26765cb2e1eSValentin Clement  ! CHECK: %[[a36:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
26865cb2e1eSValentin Clement  ! CHECK: %[[a38:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
26965cb2e1eSValentin Clement  ! CHECK-NEXT: %[[a39:.*]] = fir.embox %[[a6]](%[[a38]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
27065cb2e1eSValentin Clement  ! CHECK: %[[a40:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
27165cb2e1eSValentin Clement  ! CHECK-NEXT: %[[a41:.*]] = fir.embox %[[a4]](%[[a40]]) : (!fir.ref<!fir.array<3x3x!fir.logical<4>>>, !fir.shape<2>) -> !fir.box<!fir.array<3x3x!fir.logical<4>>>
27265cb2e1eSValentin Clement  ! CHECK: %[[a42:.*]] = fir.embox %[[a1]] : (!fir.ref<i32>) -> !fir.box<i32>
27365cb2e1eSValentin Clement  ! CHECK: %[[a43:.*]] = fir.zero_bits !fir.heap<!fir.array<?x?xi32>>
27465cb2e1eSValentin Clement  ! CHECK: %[[a44:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
27565cb2e1eSValentin Clement  ! CHECK: %[[a45:.*]] = fir.embox %[[a43]](%[[a44]]) : (!fir.heap<!fir.array<?x?xi32>>, !fir.shape<2>) -> !fir.box<!fir.heap<!fir.array<?x?xi32>>>
27665cb2e1eSValentin Clement  ! CHECK-NEXT: fir.store %[[a45]] to %[[a0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
27765cb2e1eSValentin Clement  ! CHECK: %[[a47:.*]] = fir.convert %[[a0]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>) -> !fir.ref<!fir.box<none>>
27865cb2e1eSValentin Clement  ! CHECK: %[[a48:.*]] = fir.convert %[[a39]] : (!fir.box<!fir.array<3xi32>>) -> !fir.box<none>
27965cb2e1eSValentin Clement  ! CHECK: %[[a49:.*]] = fir.convert %[[a41]] : (!fir.box<!fir.array<3x3x!fir.logical<4>>>) -> !fir.box<none>
28065cb2e1eSValentin Clement  ! CHECK: %[[a50:.*]] = fir.convert %[[a42]] : (!fir.box<i32>) -> !fir.box<none>
28165cb2e1eSValentin Clement  result = unpack(vector, mask, 343)
282*12ba74e1SValentin Clement (バレンタイン クレメン)  ! CHECK: fir.call @_FortranAUnpack(%[[a47]], %[[a48]], %[[a49]], %[[a50]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) -> ()
28365cb2e1eSValentin Clement  ! CHECK: %[[a53:.*]] = fir.load %[[a0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
28465cb2e1eSValentin Clement  ! CHECK: %[[a56:.*]] = fir.box_addr %[[a53]] : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>) -> !fir.heap<!fir.array<?x?xi32>>
2853348c083SValentin Clement  ! CHECK: fir.freemem %[[a56]] : !fir.heap<!fir.array<?x?xi32>>
28665cb2e1eSValentin Clement  ! CHECK-NEXT: return
28765cb2e1eSValentin Clementend subroutine unpack_test
28865cb2e1eSValentin Clement
28965cb2e1eSValentin Clementend module
290