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