1 ! Test lowering of COUNT intrinsic to HLFIR
2 ! RUN: bbc -emit-hlfir -o - %s 2>&1 | FileCheck %s
4 ! simple 1 argument COUNT
5 subroutine count1(a
, s
)
10 ! CHECK-LABEL: func.func @_QPcount1(
11 ! CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>
12 ! CHECK: %[[ARG1:.*]]: !fir.ref<i32>
13 ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
14 ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]]
15 ! CHECK-NEXT: %[[EXPR:.*]] = hlfir.count %[[MASK]]#0 : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> i32
16 ! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref<i32>
20 ! count with by-ref DIM argument
21 subroutine count2(a
, s
, d
)
26 ! CHECK-LABEL: func.func @_QPcount2(
27 ! CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
28 ! CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?xi32>>
29 ! CHECK: %[[ARG2:.*]]: !fir.ref<i32>
30 ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
31 ! CHECK-DAG: %[[DIM_REF:.*]]:2 = hlfir.declare %[[ARG2]]
32 ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]]
33 ! CHECK-DAG: %[[DIM:.*]] = fir.load %[[DIM_REF]]#0 : !fir.ref<i32>
34 ! CHECK-DAG: %[[EXPR:.*]] = hlfir.count %[[MASK]]#0 dim %[[DIM]] : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i32) -> !hlfir.expr<?xi32>
35 ! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>
36 ! CHECK-NEXT: hlfir.destroy %[[EXPR]] : !hlfir.expr<?xi32>
40 ! count with DIM argument by-val, mask isn't boxed
43 logical :: a(2,2) = reshape((/.true
.,.false
.,.true
.,.false
./), shape(a
))
46 ! CHECK-LABEL: func.func @_QPcount3(
47 ! CHECK: %[[ARG0:.*]]: !fir.ref<!fir.array<2xi32>>
48 ! CHECK-DAG: %[[ADDR:.*]] = fir.address_of{{.*}} : !fir.ref<!fir.array<2x2x!fir.logical<4>>>
49 ! CHECK-DAG: %[[MASK_SHAPE:.*]] = fir.shape {{.*}} -> !fir.shape<2>
50 ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ADDR]](%[[MASK_SHAPE]])
51 ! CHECK-DAG: %[[OUT_SHAPE:.*]] = fir.shape {{.*}} -> !fir.shape<1>
52 ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG0]](%[[OUT_SHAPE]])
53 ! CHECK-DAG: %[[C1:.*]] = arith.constant 1 : i32
54 ! CHECK-DAG: %[[EXPR:.*]] = hlfir.count %[[MASK]]#0 dim %[[C1]] : (!fir.ref<!fir.array<2x2x!fir.logical<4>>>, i32) -> !hlfir.expr<2xi32>
55 ! CHECK-DAG: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr<2xi32>, !fir.ref<!fir.array<2xi32>>
56 ! CHECK-NEXT: hlfir.destroy %[[EXPR]] : !hlfir.expr<2xi32>
60 ! count with dim and kind arguments
61 subroutine count4(a
, s
, d
)
66 ! CHECK-LABEL: func.func @_QPcount4(
67 ! CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
68 ! CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?xi32>>
69 ! CHECK: %[[ARG2:.*]]: !fir.ref<i32>
70 ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
71 ! CHECK-DAG: %[[DIM_REF:.*]]:2 = hlfir.declare %[[ARG2]]
72 ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]]
73 ! CHECK-DAG: %[[C8:.*]] = arith.constant 8 : i32
74 ! CHECK-DAG: %[[DIM:.*]] = fir.load %[[DIM_REF]]#0 : !fir.ref<i32>
75 ! CHECK-DAG: %[[EXPR:.*]] = hlfir.count %[[MASK]]#0 dim %[[DIM]] kind %[[C8]] : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i32, i32) -> !hlfir.expr<?xi64>
76 ! CHECK-DAG: %[[RES_SHAPE:.*]] = hlfir.shape_of %[[EXPR]]
77 ! CHECK-DAG: %[[RES:.*]] = hlfir.elemental %[[RES_SHAPE]] unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32>
78 ! CHECK-DAG: hlfir.assign %[[RES]] to %[[OUT]]#0
79 ! CHECK-NEXT: hlfir.destroy %[[RES]] : !hlfir.expr<?xi32>
80 ! CHECK-NEXT: hlfir.destroy %[[EXPR]] : !hlfir.expr<?xi64>
84 subroutine count5(a
, s
)
85 logical, allocatable
:: a(:)
89 ! CHECK-LABEL: func.func @_QPcount5(
90 ! CHECK: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.logical<4>>>>>
91 ! CHECK: %[[ARG1:.*]]: !fir.ref<i32>
92 ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
93 ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]]
94 ! CHECK-NEXT: %[[MASK_LOADED:.*]] = fir.load %[[MASK]]#0
95 ! CHECK-NEXT: %[[EXPR:.*]] = hlfir.count %[[MASK_LOADED]] : (!fir.box<!fir.heap<!fir.array<?x!fir.logical<4>>>>) -> i32
96 ! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref<i32>