1*656b8d6cSValentin Clement! RUN: bbc %s -o - | FileCheck %s 2*656b8d6cSValentin Clement 3*656b8d6cSValentin Clementmodule cs 4*656b8d6cSValentin Clement type r 5*656b8d6cSValentin Clement integer n, d 6*656b8d6cSValentin Clement end type r 7*656b8d6cSValentin Clement 8*656b8d6cSValentin Clement type t2 9*656b8d6cSValentin Clement integer :: f1(5) 10*656b8d6cSValentin Clement type(r) :: f2 11*656b8d6cSValentin Clement end type t2 12*656b8d6cSValentin Clement 13*656b8d6cSValentin Clement type t3 14*656b8d6cSValentin Clement type(t2) :: f(3,3) 15*656b8d6cSValentin Clement end type t3 16*656b8d6cSValentin Clement 17*656b8d6cSValentin Clementcontains 18*656b8d6cSValentin Clement 19*656b8d6cSValentin Clement ! CHECK: func @_QMcsPc1( 20*656b8d6cSValentin Clement ! CHECK-SAME: %[[arg0:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}}, %[[arg1:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}}) 21*656b8d6cSValentin Clement function c1(e, c) 22*656b8d6cSValentin Clement type(r), intent(in) :: e(:), c(:) 23*656b8d6cSValentin Clement ! CHECK-DAG: fir.alloca !fir.logical<1> {bindc_name = "c1", uniq_name = "_QMcsFc1Ec1"} 24*656b8d6cSValentin Clement logical*1 :: c1 25*656b8d6cSValentin Clement ! CHECK-DAG: %[[fldn:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}> 26*656b8d6cSValentin Clement ! CHECK: %[[ext1:.*]]:3 = fir.box_dims %[[arg1]], %c0{{.*}} : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, index) -> (index, index, index) 27*656b8d6cSValentin Clement ! CHECK-DAG: %[[slice1:.*]] = fir.slice %c1{{.*}}, %[[ext1]]#1, %c1{{.*}} path %[[fldn]] : (index, index, index, !fir.field) -> !fir.slice<1> 28*656b8d6cSValentin Clement ! CHECK-DAG: %[[ext0:.*]]:3 = fir.box_dims %[[arg0]], %c0{{.*}} : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, index) -> (index, index, index) 29*656b8d6cSValentin Clement ! CHECK: %[[slice0:.*]] = fir.slice %c1{{.*}}, %[[ext0]]#1, %c1{{.*}} path %[[fldn]] : (index, index, index, !fir.field) -> !fir.slice<1> 30*656b8d6cSValentin Clement ! CHECK-DAG: = fir.array_coor %[[arg1]] [%[[slice1]]] %[[index:.*]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 31*656b8d6cSValentin Clement ! CHECK-DAG: = fir.array_coor %[[arg0]] [%[[slice0]]] %[[index]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 32*656b8d6cSValentin Clement ! CHECK: = fir.call @_FortranAAll( 33*656b8d6cSValentin Clement c1 = all(c%n == e%n) 34*656b8d6cSValentin Clement end function c1 35*656b8d6cSValentin Clement 36*656b8d6cSValentin Clement! CHECK-LABEL: func @_QMcsPtest2( 37*656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}) { 38*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 2 : index 39*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 4 : index 40*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_4:.*]] = arith.constant 0 : index 41*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 1 : index 42*656b8d6cSValentin Clement! CHECK: %[[VAL_6:.*]] = fir.field_index f2, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}> 43*656b8d6cSValentin Clement! CHECK: %[[VAL_7:.*]] = fir.field_index d, !fir.type<_QMcsTr{n:i32,d:i32}> 44*656b8d6cSValentin Clement! CHECK: %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_4]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, index) -> (index, index, index) 45*656b8d6cSValentin Clement! CHECK: %[[VAL_9:.*]] = fir.slice %[[VAL_5]], %[[VAL_8]]#1, %[[VAL_5]] path %[[VAL_6]], %[[VAL_7]] : (index, index, index, !fir.field, !fir.field) -> !fir.slice<1> 46*656b8d6cSValentin Clement! CHECK: %[[VAL_8_2:.*]] = arith.cmpi sgt, %[[VAL_8]]#1, %[[VAL_4]] : index 47*656b8d6cSValentin Clement! CHECK: %[[VAL_8_3:.*]] = arith.select %[[VAL_8_2]], %[[VAL_8]]#1, %[[VAL_4]] : index 48*656b8d6cSValentin Clement! CHECK: %[[VAL_10:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}> 49*656b8d6cSValentin Clement! CHECK: %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_4]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, index) -> (index, index, index) 50*656b8d6cSValentin Clement! CHECK: %[[VAL_12:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_4]] : (index, index, index, !fir.field, index) -> !fir.slice<1> 51*656b8d6cSValentin Clement! CHECK: %[[VAL_13:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_3]] : (index, index, index, !fir.field, index) -> !fir.slice<1> 52*656b8d6cSValentin Clement! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_2]] : (index, index, index, !fir.field, index) -> !fir.slice<1> 53*656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_4]], %[[VAL_8_3]] : index, index) 54*656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_15:.*]]: index, %[[VAL_16:.*]]: index): 55*656b8d6cSValentin Clement! CHECK: %[[VAL_17:.*]] = arith.cmpi sgt, %[[VAL_16]], %[[VAL_4]] : index 56*656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_17]], ^bb2, ^bb3 57*656b8d6cSValentin Clement! CHECK: ^bb2: 58*656b8d6cSValentin Clement! CHECK: %[[VAL_18:.*]] = arith.addi %[[VAL_15]], %[[VAL_5]] : index 59*656b8d6cSValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_12]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 60*656b8d6cSValentin Clement! CHECK: %[[VAL_20:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32> 61*656b8d6cSValentin Clement! CHECK: %[[VAL_21:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_13]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 62*656b8d6cSValentin Clement! CHECK: %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<i32> 63*656b8d6cSValentin Clement! CHECK: %[[VAL_23:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_14]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 64*656b8d6cSValentin Clement! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_23]] : !fir.ref<i32> 65*656b8d6cSValentin Clement! CHECK: %[[VAL_25:.*]] = arith.divsi %[[VAL_22]], %[[VAL_24]] : i32 66*656b8d6cSValentin Clement! CHECK: %[[VAL_26:.*]] = arith.addi %[[VAL_20]], %[[VAL_25]] : i32 67*656b8d6cSValentin Clement! CHECK: %[[VAL_27:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_9]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 68*656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_26]] to %[[VAL_27]] : !fir.ref<i32> 69*656b8d6cSValentin Clement! CHECK: %[[VAL_28:.*]] = arith.subi %[[VAL_16]], %[[VAL_5]] : index 70*656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_18]], %[[VAL_28]] : index, index) 71*656b8d6cSValentin Clement! CHECK: ^bb3: 72*656b8d6cSValentin Clement! CHECK: return 73*656b8d6cSValentin Clement! CHECK: } 74*656b8d6cSValentin Clement 75*656b8d6cSValentin Clement 76*656b8d6cSValentin Clement subroutine test2(a1, a2) 77*656b8d6cSValentin Clement type(t2) :: a1(:), a2(:) 78*656b8d6cSValentin Clement a1%f2%d = a2%f1(1) + a2%f1(5) / a2%f1(3) 79*656b8d6cSValentin Clement end subroutine test2 80*656b8d6cSValentin Clement 81*656b8d6cSValentin Clement! CHECK-LABEL: func @_QMcsPtest3( 82*656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}) { 83*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 2 : index 84*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 3 : index 85*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_4:.*]] = arith.constant 4 : i32 86*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 1 : index 87*656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_6:.*]] = arith.constant 0 : index 88*656b8d6cSValentin Clement! CHECK: %[[VAL_7:.*]] = fir.field_index f, !fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}> 89*656b8d6cSValentin Clement! CHECK: %[[VAL_8:.*]] = fir.field_index f2, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}> 90*656b8d6cSValentin Clement! CHECK: %[[VAL_9:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}> 91*656b8d6cSValentin Clement! CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, index) -> (index, index, index) 92*656b8d6cSValentin Clement! CHECK: %[[VAL_11:.*]] = fir.slice %[[VAL_5]], %[[VAL_10]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_6]], %[[VAL_6]], %[[VAL_8]], %[[VAL_9]] : (index, index, index, !fir.field, index, index, !fir.field, !fir.field) -> !fir.slice<1> 93*656b8d6cSValentin Clement! CHECK: %[[VAL_10_2:.*]] = arith.cmpi sgt, %[[VAL_10]]#1, %[[VAL_6]] : index 94*656b8d6cSValentin Clement! CHECK: %[[VAL_10_3:.*]] = arith.select %[[VAL_10_2]], %[[VAL_10]]#1, %[[VAL_6]] : index 95*656b8d6cSValentin Clement! CHECK: %[[VAL_12:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}> 96*656b8d6cSValentin Clement! CHECK: %[[VAL_13:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, index) -> (index, index, index) 97*656b8d6cSValentin Clement! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_5]], %[[VAL_13]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_5]], %[[VAL_5]], %[[VAL_12]], %[[VAL_3]] : (index, index, index, !fir.field, index, index, !fir.field, index) -> !fir.slice<1> 98*656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_6]], %[[VAL_10_3]] : index, index) 99*656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_15:.*]]: index, %[[VAL_16:.*]]: index): 100*656b8d6cSValentin Clement! CHECK: %[[VAL_17:.*]] = arith.cmpi sgt, %[[VAL_16]], %[[VAL_6]] : index 101*656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_17]], ^bb2, ^bb3 102*656b8d6cSValentin Clement! CHECK: ^bb2: 103*656b8d6cSValentin Clement! CHECK: %[[VAL_18:.*]] = arith.addi %[[VAL_15]], %[[VAL_5]] : index 104*656b8d6cSValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_14]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 105*656b8d6cSValentin Clement! CHECK: %[[VAL_20:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32> 106*656b8d6cSValentin Clement! CHECK: %[[VAL_21:.*]] = arith.subi %[[VAL_20]], %[[VAL_4]] : i32 107*656b8d6cSValentin Clement! CHECK: %[[VAL_22:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_11]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 108*656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_21]] to %[[VAL_22]] : !fir.ref<i32> 109*656b8d6cSValentin Clement! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_16]], %[[VAL_5]] : index 110*656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_18]], %[[VAL_23]] : index, index) 111*656b8d6cSValentin Clement! CHECK: ^bb3: 112*656b8d6cSValentin Clement! CHECK: %[[VAL_24:.*]] = fir.slice %[[VAL_5]], %[[VAL_13]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_2]], %[[VAL_2]], %[[VAL_12]], %[[VAL_5]] : (index, index, index, !fir.field, index, index, !fir.field, index) -> !fir.slice<1> 113*656b8d6cSValentin Clement! CHECK: %[[VAL_13_2:.*]] = arith.cmpi sgt, %[[VAL_13]]#1, %[[VAL_6]] : index 114*656b8d6cSValentin Clement! CHECK: %[[VAL_13_3:.*]] = arith.select %[[VAL_13_2]], %[[VAL_13]]#1, %[[VAL_6]] : index 115*656b8d6cSValentin Clement! CHECK: %[[VAL_25:.*]] = fir.field_index d, !fir.type<_QMcsTr{n:i32,d:i32}> 116*656b8d6cSValentin Clement! CHECK: %[[VAL_26:.*]] = fir.slice %[[VAL_5]], %[[VAL_10]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_6]], %[[VAL_5]], %[[VAL_8]], %[[VAL_25]] : (index, index, index, !fir.field, index, index, !fir.field, !fir.field) -> !fir.slice<1> 117*656b8d6cSValentin Clement! CHECK: br ^bb4(%[[VAL_6]], %[[VAL_13_3]] : index, index) 118*656b8d6cSValentin Clement! CHECK: ^bb4(%[[VAL_27:.*]]: index, %[[VAL_28:.*]]: index): 119*656b8d6cSValentin Clement! CHECK: %[[VAL_29:.*]] = arith.cmpi sgt, %[[VAL_28]], %[[VAL_6]] : index 120*656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_29]], ^bb5, ^bb6 121*656b8d6cSValentin Clement! CHECK: ^bb5: 122*656b8d6cSValentin Clement! CHECK: %[[VAL_30:.*]] = arith.addi %[[VAL_27]], %[[VAL_5]] : index 123*656b8d6cSValentin Clement! CHECK: %[[VAL_31:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_26]]] %[[VAL_30]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 124*656b8d6cSValentin Clement! CHECK: %[[VAL_32:.*]] = fir.load %[[VAL_31]] : !fir.ref<i32> 125*656b8d6cSValentin Clement! CHECK: %[[VAL_33:.*]] = arith.addi %[[VAL_32]], %[[VAL_4]] : i32 126*656b8d6cSValentin Clement! CHECK: %[[VAL_34:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_24]]] %[[VAL_30]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32> 127*656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_33]] to %[[VAL_34]] : !fir.ref<i32> 128*656b8d6cSValentin Clement! CHECK: %[[VAL_35:.*]] = arith.subi %[[VAL_28]], %[[VAL_5]] : index 129*656b8d6cSValentin Clement! CHECK: br ^bb4(%[[VAL_30]], %[[VAL_35]] : index, index) 130*656b8d6cSValentin Clement! CHECK: ^bb6: 131*656b8d6cSValentin Clement! CHECK: return 132*656b8d6cSValentin Clement! CHECK: } 133*656b8d6cSValentin Clement 134*656b8d6cSValentin Clement subroutine test3(a3, a4) 135*656b8d6cSValentin Clement type(t3) :: a3(:), a4(:) 136*656b8d6cSValentin Clement a3%f(1,1)%f2%n = a4%f(2,2)%f1(4) - 4 137*656b8d6cSValentin Clement a4%f(3,3)%f1(2) = a3%f(1,2)%f2%d + 4 138*656b8d6cSValentin Clement end subroutine test3 139*656b8d6cSValentin Clementend module cs 140*656b8d6cSValentin Clement 141*656b8d6cSValentin Clement! CHECK: func private @_FortranAAll(!fir.box<none>, !fir.ref<i8>, i32, i32) -> i1 attributes {fir.runtime} 142