[AMDGPU] Test codegen'ing True16 additions.
[llvm-project.git] / flang / test / Lower / HLFIR / count.f90
blob252f92789c76074243e4886657ddea4ba59de6e6
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)
6 logical :: a(:)
7 integer :: s
8 s = COUNT(a)
9 end subroutine
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>
17 ! CHECK-NEXT: return
18 ! CHECK-NEXT: }
20 ! count with by-ref DIM argument
21 subroutine count2(a, s, d)
22 logical :: a(:,:)
23 integer :: s(:), d
24 s = COUNT(a, d)
25 end subroutine
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>
37 ! CHECK-NEXT: return
38 ! CHECK-NEXT: }
40 ! count with DIM argument by-val, mask isn't boxed
41 subroutine count3(s)
42 integer :: s(2)
43 logical :: a(2,2) = reshape((/.true.,.false.,.true.,.false./), shape(a))
44 s = COUNT(a, 1)
45 end subroutine
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>
57 ! CHECK-NEXT: return
58 ! CHECK-NEXT: }
60 ! count with dim and kind arguments
61 subroutine count4(a, s, d)
62 logical :: a(:,:)
63 integer :: s(:), d
64 s = COUNT(a, d, 8)
65 end subroutine
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>
81 ! CHECK-NEXT: return
82 ! CHECK-NEXT: }
84 subroutine count5(a, s)
85 logical, allocatable :: a(:)
86 integer :: s
87 s = COUNT(a)
88 end subroutine
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>
97 ! CHECK-NEXT: return
98 ! CHECK-NEXT: }