[LLVM] Fix Maintainers.md formatting (NFC)
[llvm-project.git] / flang / test / HLFIR / maxloc-elemental.fir
blob497a58c9bd1d4e2326c9cf4b5cba718edf9b88db
1 // RUN: fir-opt %s -opt-bufferization | FileCheck %s
3 func.func @_QPtest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<i32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) {
4   %c0 = arith.constant 0 : index
5   %0:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
6   %1:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
7   %2:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
8   %3 = fir.load %2#0 : !fir.ref<i32>
9   %4:3 = fir.box_dims %0#0, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
10   %5 = fir.shape %4#1 : (index) -> !fir.shape<1>
11   %6 = hlfir.elemental %5 unordered : (!fir.shape<1>) -> !hlfir.expr<?x!fir.logical<4>> {
12   ^bb0(%arg3: index):
13     %8 = hlfir.designate %0#0 (%arg3)  : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
14     %9 = fir.load %8 : !fir.ref<i32>
15     %10 = arith.cmpi sge, %9, %3 : i32
16     %11 = fir.convert %10 : (i1) -> !fir.logical<4>
17     hlfir.yield_element %11 : !fir.logical<4>
18   }
19   %7 = hlfir.maxloc %0#0 mask %6 {fastmath = #arith.fastmath<contract>} : (!fir.box<!fir.array<?xi32>>, !hlfir.expr<?x!fir.logical<4>>) -> !hlfir.expr<1xi32>
20   hlfir.assign %7 to %1#0 : !hlfir.expr<1xi32>, !fir.box<!fir.array<?xi32>>
21   hlfir.destroy %7 : !hlfir.expr<1xi32>
22   hlfir.destroy %6 : !hlfir.expr<?x!fir.logical<4>>
23   return
25 // CHECK-LABEL: func.func @_QPtest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<i32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) {
26 // CHECK-NEXT:    %true = arith.constant true
27 // CHECK-NEXT:    %c-2147483648_i32 = arith.constant -2147483648 : i32
28 // CHECK-NEXT:    %c1_i32 = arith.constant 1 : i32
29 // CHECK-NEXT:    %c0 = arith.constant 0 : index
30 // CHECK-NEXT:    %c1 = arith.constant 1 : index
31 // CHECK-NEXT:    %c0_i32 = arith.constant 0 : i32
32 // CHECK-NEXT:    %[[V0:.*]] = fir.alloca i32
33 // CHECK-NEXT:    %[[RES:.*]] = fir.alloca !fir.array<1xi32>
34 // CHECK-NEXT:    %[[V1:.*]]:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
35 // CHECK-NEXT:    %[[V2:.*]]:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
36 // CHECK-NEXT:    %[[V3:.*]]:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
37 // CHECK-NEXT:    %[[V4:.*]] = fir.load %[[V3]]#0 : !fir.ref<i32>
38 // CHECK-NEXT:    %[[V8:.*]] = hlfir.designate %[[RES]] (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
39 // CHECK-NEXT:    fir.store %c0_i32 to %[[V8]] : !fir.ref<i32>
40 // CHECK-NEXT:    fir.store %c0_i32 to %[[V0]] : !fir.ref<i32>
41 // CHECK-NEXT:    %[[V9:.*]]:3 = fir.box_dims %[[V1]]#0, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
42 // CHECK-NEXT:    %[[V10:.*]] = arith.subi %[[V9]]#1, %c1 : index
43 // CHECK-NEXT:    %[[V11:.*]] = fir.do_loop %arg3 = %c0 to %[[V10]] step %c1 iter_args(%arg4 = %c-2147483648_i32) -> (i32) {
44 // CHECK-NEXT:      %[[V14:.*]] = arith.addi %arg3, %c1 : index
45 // CHECK-NEXT:      %[[V15:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]])  : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
46 // CHECK-NEXT:      %[[V16:.*]] = fir.load %[[V15]] : !fir.ref<i32>
47 // CHECK-NEXT:      %[[V17:.*]] = arith.cmpi sge, %[[V16]], %[[V4]] : i32
48 // CHECK-NEXT:      %[[V18:.*]] = fir.if %[[V17]] -> (i32) {
49 // CHECK-NEXT:        %[[ISFIRST:.*]] = fir.load %[[V0]] : !fir.ref<i32>
50 // CHECK-NEXT:        %[[V19:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
51 // CHECK-NEXT:        %[[V20:.*]] = fir.load %[[V19]] : !fir.ref<i32>
52 // CHECK-NEXT:        %[[V21:.*]] = arith.cmpi sgt, %[[V20]], %arg4 : i32
53 // CHECK-NEXT:        %[[ISFIRSTL:.*]] = fir.convert %[[ISFIRST]] : (i32) -> i1
54 // CHECK-NEXT:        %[[ISFIRSTNOT:.*]] = arith.xori %[[ISFIRSTL]], %true : i1
55 // CHECK-NEXT:        %[[ORCOND:.*]] = arith.ori %[[V21]], %[[ISFIRSTNOT]] : i1
56 // CHECK-NEXT:        %[[V22:.*]] = fir.if %[[ORCOND]] -> (i32) {
57 // CHECK-NEXT:          fir.store %c1_i32 to %[[V0]] : !fir.ref<i32>
58 // CHECK-NEXT:          %[[V23:.*]] = hlfir.designate %[[RES]] (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
59 // CHECK-NEXT:          %[[V24:.*]] = fir.convert %[[V14]] : (index) -> i32
60 // CHECK-NEXT:          fir.store %[[V24]] to %[[V23]] : !fir.ref<i32>
61 // CHECK-NEXT:          fir.result %[[V20]] : i32
62 // CHECK-NEXT:        } else {
63 // CHECK-NEXT:          fir.result %arg4 : i32
64 // CHECK-NEXT:        }
65 // CHECK-NEXT:        fir.result %[[V22]] : i32
66 // CHECK-NEXT:      } else {
67 // CHECK-NEXT:        fir.result %arg4 : i32
68 // CHECK-NEXT:      }
69 // CHECK-NEXT:      fir.result %[[V18]] : i32
70 // CHECK-NEXT:    }
71 // CHECK-NEXT:    %[[BD:.*]]:3 = fir.box_dims %[[V2]]#0, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
72 // CHECK-NEXT:    fir.do_loop %arg3 = %c1 to %[[BD]]#1 step %c1 unordered {
73 // CHECK-NEXT:      %[[V13:.*]] = hlfir.designate %[[RES]] (%arg3)  : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
74 // CHECK-NEXT:      %[[V14:.*]] = fir.load %[[V13]] : !fir.ref<i32>
75 // CHECK-NEXT:      %[[V15:.*]] = hlfir.designate %[[V2]]#0 (%arg3)  : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
76 // CHECK-NEXT:      hlfir.assign %[[V14]] to %[[V15]] : i32, !fir.ref<i32>
77 // CHECK-NEXT:    }
78 // CHECK-NEXT:    return
79 // CHECK-NEXT:  }
83 func.func @_QPtest_float(%arg0: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<f32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) {
84   %c0 = arith.constant 0 : index
85   %0:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
86   %1:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
87   %2:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
88   %3 = fir.load %2#0 : !fir.ref<f32>
89   %4:3 = fir.box_dims %0#0, %c0 : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index)
90   %5 = fir.shape %4#1 : (index) -> !fir.shape<1>
91   %6 = hlfir.elemental %5 unordered : (!fir.shape<1>) -> !hlfir.expr<?x!fir.logical<4>> {
92   ^bb0(%arg3: index):
93     %8 = hlfir.designate %0#0 (%arg3)  : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
94     %9 = fir.load %8 : !fir.ref<f32>
95     %10 = arith.cmpf oge, %9, %3 : f32
96     %11 = fir.convert %10 : (i1) -> !fir.logical<4>
97     hlfir.yield_element %11 : !fir.logical<4>
98   }
99   %7 = hlfir.maxloc %0#0 mask %6 {fastmath = #arith.fastmath<contract>} : (!fir.box<!fir.array<?xf32>>, !hlfir.expr<?x!fir.logical<4>>) -> !hlfir.expr<1xi32>
100   hlfir.assign %7 to %1#0 : !hlfir.expr<1xi32>, !fir.box<!fir.array<?xi32>>
101   hlfir.destroy %7 : !hlfir.expr<1xi32>
102   hlfir.destroy %6 : !hlfir.expr<?x!fir.logical<4>>
103   return
105 // CHECK-LABEL: _QPtest_float
106 // CHECK:        %cst = arith.constant 0xFF800000 : f32
107 // CHECK:        %[[V11:.*]] = fir.do_loop %arg3 = %c0 to %[[V10:.*]] step %c1 iter_args(%arg4 = %cst) -> (f32) {
108 // CHECK-NEXT:     %[[V14:.*]] = arith.addi %arg3, %c1 : index
109 // CHECK-NEXT:     %[[V15:.*]] = hlfir.designate %[[V1:.*]]#0 (%[[V14]])  : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
110 // CHECK-NEXT:     %[[V16:.*]] = fir.load %[[V15]] : !fir.ref<f32>
111 // CHECK-NEXT:     %[[V17:.*]] = arith.cmpf oge, %[[V16]], %[[V4:.*]] : f32
112 // CHECK-NEXT:     %[[V18:.*]] = fir.if %[[V17]] -> (f32) {
113 // CHECK-NEXT:       %[[ISFIRST:.*]] = fir.load %[[V0:.*]] : !fir.ref<i32>
114 // CHECK-NEXT:       %[[V19:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
115 // CHECK-NEXT:       %[[V20:.*]] = fir.load %[[V19]] : !fir.ref<f32>
116 // CHECK-NEXT:       %[[NEW_MIN:.*]] = arith.cmpf ogt, %[[V20]], %arg4 fastmath<contract> : f32
117 // CHECK-NEXT:       %[[CONDRED:.*]] = arith.cmpf une, %arg4, %arg4 fastmath<contract> : f32
118 // CHECK-NEXT:       %[[CONDELEM:.*]] = arith.cmpf oeq, %[[V20]], %[[V20]] fastmath<contract> : f32
119 // CHECK-NEXT:       %[[ANDCOND:.*]] = arith.andi %[[CONDRED]], %[[CONDELEM]] : i1
120 // CHECK-NEXT:       %[[NEW_MIN2:.*]] = arith.ori %[[NEW_MIN]], %[[ANDCOND]] : i1
121 // CHECK-NEXT:       %[[ISFIRSTL:.*]] = fir.convert %[[ISFIRST]] : (i32) -> i1
122 // CHECK-NEXT:       %[[ISFIRSTNOT:.*]] = arith.xori %[[ISFIRSTL]], %true : i1
123 // CHECK-NEXT:       %[[ORCOND:.*]] = arith.ori %[[NEW_MIN2]], %[[ISFIRSTNOT]] : i1
124 // CHECK-NEXT:       %[[V22:.*]] = fir.if %[[ORCOND]] -> (f32) {
125 // CHECK-NEXT:         fir.store %c1_i32 to %[[V0]] : !fir.ref<i32>
126 // CHECK-NEXT:         %[[V23:.*]] = hlfir.designate %{{.}} (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
127 // CHECK-NEXT:         %[[V24:.*]] = fir.convert %[[V14]] : (index) -> i32
128 // CHECK-NEXT:         fir.store %[[V24]] to %[[V23]] : !fir.ref<i32>
129 // CHECK-NEXT:         fir.result %[[V20]] : f32
130 // CHECK-NEXT:       } else {
131 // CHECK-NEXT:         fir.result %arg4 : f32
132 // CHECK-NEXT:       }
133 // CHECK-NEXT:       fir.result %[[V22]] : f32
134 // CHECK-NEXT:     } else {
135 // CHECK-NEXT:       fir.result %arg4 : f32
136 // CHECK-NEXT:     }
137 // CHECK-NEXT:     fir.result %[[V18]] : f32
138 // CHECK-NEXT:   }