xref: /llvm-project/flang/test/Lower/OpenMP/wsloop-reduction-logical-neqv-byref.f90 (revision 937cbce14c9aa956342a9c818c26a8a557802843)
1f46f5a01STom Eccles! RUN: bbc -emit-hlfir -fopenmp --force-byref-reduction %s -o - | FileCheck %s
2f46f5a01STom Eccles! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --force-byref-reduction %s -o - | FileCheck %s
3f46f5a01STom Eccles
4f46f5a01STom Eccles! NOTE: Assertions have been autogenerated by utils/generate-test-checks.py
5f46f5a01STom Eccles
6d84252e0SSergio Afonso! CHECK-LABEL:   omp.declare_reduction @neqv_reduction : !fir.ref<!fir.logical<4>>
7f2027a93STom Eccles! CHECK-SAME:    alloc {
8f2027a93STom Eccles! CHECK:           %[[REF:.*]] = fir.alloca !fir.logical<4>
9f2027a93STom Eccles! CHECK:           omp.yield(%[[REF]] : !fir.ref<!fir.logical<4>>)
10f2027a93STom Eccles! CHECK-LABEL:   } init {
11f2027a93STom Eccles! CHECK:         ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>, %[[ALLOC:.*]]: !fir.ref<!fir.logical<4>>):
12f46f5a01STom Eccles! CHECK:           %[[VAL_1:.*]] = arith.constant false
13f46f5a01STom Eccles! CHECK:           %[[VAL_2:.*]] = fir.convert %[[VAL_1]] : (i1) -> !fir.logical<4>
14f2027a93STom Eccles! CHECK:           fir.store %[[VAL_2]] to %[[ALLOC]] : !fir.ref<!fir.logical<4>>
15f2027a93STom Eccles! CHECK:           omp.yield(%[[ALLOC]] : !fir.ref<!fir.logical<4>>)
16f46f5a01STom Eccles
17f46f5a01STom Eccles! CHECK-LABEL:   } combiner {
18f46f5a01STom Eccles! CHECK:         ^bb0(%[[ARG0:.*]]: !fir.ref<!fir.logical<4>>, %[[ARG1:.*]]: !fir.ref<!fir.logical<4>>):
19f46f5a01STom Eccles! CHECK:           %[[LD0:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.logical<4>>
20f46f5a01STom Eccles! CHECK:           %[[LD1:.*]] = fir.load %[[ARG1]] : !fir.ref<!fir.logical<4>>
21f46f5a01STom Eccles! CHECK:           %[[VAL_2:.*]] = fir.convert %[[LD0]] : (!fir.logical<4>) -> i1
22f46f5a01STom Eccles! CHECK:           %[[VAL_3:.*]] = fir.convert %[[LD1]] : (!fir.logical<4>) -> i1
23f46f5a01STom Eccles! CHECK:           %[[RES:.*]] = arith.cmpi ne, %[[VAL_2]], %[[VAL_3]] : i1
24f46f5a01STom Eccles! CHECK:           %[[VAL_5:.*]] = fir.convert %[[RES]] : (i1) -> !fir.logical<4>
25f46f5a01STom Eccles! CHECK:           fir.store %[[VAL_5]] to %[[ARG0]] : !fir.ref<!fir.logical<4>>
26f46f5a01STom Eccles! CHECK:           omp.yield(%[[ARG0]] : !fir.ref<!fir.logical<4>>)
27f46f5a01STom Eccles! CHECK:         }
28f46f5a01STom Eccles
29f46f5a01STom Eccles! CHECK-LABEL:   func.func @_QPsimple_reduction(
30f46f5a01STom Eccles! CHECK-SAME:                                   %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "y"}) {
31f46f5a01STom Eccles! CHECK:           %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_reductionEi"}
32f46f5a01STom Eccles! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFsimple_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
33f46f5a01STom Eccles! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.logical<4> {bindc_name = "x", uniq_name = "_QFsimple_reductionEx"}
34f46f5a01STom Eccles! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_3]] {uniq_name = "_QFsimple_reductionEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
35f46f5a01STom Eccles! CHECK:           %[[VAL_5:.*]] = arith.constant 100 : index
36f46f5a01STom Eccles! CHECK:           %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
371710c8cfSSlava Zakharin! CHECK:           %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_6]]) dummy_scope %{{[0-9]+}} {uniq_name = "_QFsimple_reductionEy"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>)
38f46f5a01STom Eccles! CHECK:           %[[VAL_8:.*]] = arith.constant true
39f46f5a01STom Eccles! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i1) -> !fir.logical<4>
40f46f5a01STom Eccles! CHECK:           hlfir.assign %[[VAL_9]] to %[[VAL_4]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
41f46f5a01STom Eccles! CHECK:           omp.parallel {
42*937cbce1SKareem Ergawy! CHECK:             %[[VAL_10:.*]] = fir.alloca i32 {bindc_name = "i", pinned, {{.*}}}
43*937cbce1SKareem Ergawy! CHECK:             %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]] {uniq_name = "_QFsimple_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
44f46f5a01STom Eccles! CHECK:             %[[VAL_12:.*]] = arith.constant 1 : i32
45f46f5a01STom Eccles! CHECK:             %[[VAL_13:.*]] = arith.constant 100 : i32
46f46f5a01STom Eccles! CHECK:             %[[VAL_14:.*]] = arith.constant 1 : i32
47*937cbce1SKareem Ergawy! CHECK:             omp.wsloop reduction(byref @neqv_reduction %[[VAL_4]]#0 -> %[[VAL_15:.*]] : !fir.ref<!fir.logical<4>>) {
48ca4dbc27SSergio Afonso! CHECK-NEXT:          omp.loop_nest (%[[VAL_16:.*]]) : i32 = (%[[VAL_12]]) to (%[[VAL_13]]) inclusive step (%[[VAL_14]]) {
49f46f5a01STom Eccles! CHECK:                 %[[VAL_17:.*]]:2 = hlfir.declare %[[VAL_15]] {uniq_name = "_QFsimple_reductionEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
50ca4dbc27SSergio Afonso! CHECK:                 fir.store %[[VAL_16]] to %[[VAL_11]]#1 : !fir.ref<i32>
51f46f5a01STom Eccles! CHECK:                 %[[VAL_18:.*]] = fir.load %[[VAL_17]]#0 : !fir.ref<!fir.logical<4>>
52f46f5a01STom Eccles! CHECK:                 %[[VAL_19:.*]] = fir.load %[[VAL_11]]#0 : !fir.ref<i32>
53f46f5a01STom Eccles! CHECK:                 %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
54f46f5a01STom Eccles! CHECK:                 %[[VAL_21:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_20]])  : (!fir.ref<!fir.array<100x!fir.logical<4>>>, i64) -> !fir.ref<!fir.logical<4>>
55f46f5a01STom Eccles! CHECK:                 %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<!fir.logical<4>>
56f46f5a01STom Eccles! CHECK:                 %[[VAL_23:.*]] = fir.convert %[[VAL_18]] : (!fir.logical<4>) -> i1
57f46f5a01STom Eccles! CHECK:                 %[[VAL_24:.*]] = fir.convert %[[VAL_22]] : (!fir.logical<4>) -> i1
58f46f5a01STom Eccles! CHECK:                 %[[VAL_25:.*]] = arith.cmpi ne, %[[VAL_23]], %[[VAL_24]] : i1
59f46f5a01STom Eccles! CHECK:                 %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i1) -> !fir.logical<4>
60f46f5a01STom Eccles! CHECK:                 hlfir.assign %[[VAL_26]] to %[[VAL_17]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
61f46f5a01STom Eccles! CHECK:                 omp.yield
62f46f5a01STom Eccles! CHECK:             omp.terminator
63f46f5a01STom Eccles! CHECK:           return
64f46f5a01STom Eccles
65f46f5a01STom Ecclessubroutine simple_reduction(y)
66f46f5a01STom Eccles  logical :: x, y(100)
67f46f5a01STom Eccles  x = .true.
68f46f5a01STom Eccles  !$omp parallel
69f46f5a01STom Eccles  !$omp do reduction(.neqv.:x)
70f46f5a01STom Eccles  do i=1, 100
71f46f5a01STom Eccles    x = x .neqv. y(i)
72f46f5a01STom Eccles  end do
73f46f5a01STom Eccles  !$omp end do
74f46f5a01STom Eccles  !$omp end parallel
75f46f5a01STom Ecclesend subroutine
76f46f5a01STom Eccles
77f46f5a01STom Eccles
78f46f5a01STom Eccles! CHECK-LABEL:   func.func @_QPsimple_reduction_switch_order(
79f46f5a01STom Eccles! CHECK-SAME:                                                %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "y"}) {
80f46f5a01STom Eccles! CHECK:           %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_reduction_switch_orderEi"}
81f46f5a01STom Eccles! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFsimple_reduction_switch_orderEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
82f46f5a01STom Eccles! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.logical<4> {bindc_name = "x", uniq_name = "_QFsimple_reduction_switch_orderEx"}
83f46f5a01STom Eccles! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_3]] {uniq_name = "_QFsimple_reduction_switch_orderEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
84f46f5a01STom Eccles! CHECK:           %[[VAL_5:.*]] = arith.constant 100 : index
85f46f5a01STom Eccles! CHECK:           %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
861710c8cfSSlava Zakharin! CHECK:           %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_6]]) dummy_scope %{{[0-9]+}} {uniq_name = "_QFsimple_reduction_switch_orderEy"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>)
87f46f5a01STom Eccles! CHECK:           %[[VAL_8:.*]] = arith.constant true
88f46f5a01STom Eccles! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i1) -> !fir.logical<4>
89f46f5a01STom Eccles! CHECK:           hlfir.assign %[[VAL_9]] to %[[VAL_4]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
90f46f5a01STom Eccles! CHECK:           omp.parallel {
91*937cbce1SKareem Ergawy! CHECK:             %[[VAL_10:.*]] = fir.alloca i32 {bindc_name = "i", pinned, {{.*}}}
92*937cbce1SKareem Ergawy! CHECK:             %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]] {uniq_name = "_QFsimple_reduction_switch_orderEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
93f46f5a01STom Eccles! CHECK:             %[[VAL_12:.*]] = arith.constant 1 : i32
94f46f5a01STom Eccles! CHECK:             %[[VAL_13:.*]] = arith.constant 100 : i32
95f46f5a01STom Eccles! CHECK:             %[[VAL_14:.*]] = arith.constant 1 : i32
96*937cbce1SKareem Ergawy! CHECK:             omp.wsloop reduction(byref @neqv_reduction %[[VAL_4]]#0 -> %[[VAL_15:.*]] : !fir.ref<!fir.logical<4>>) {
97ca4dbc27SSergio Afonso! CHECK-NEXT:          omp.loop_nest (%[[VAL_16:.*]]) : i32 = (%[[VAL_12]]) to (%[[VAL_13]]) inclusive step (%[[VAL_14]]) {
98f46f5a01STom Eccles! CHECK:                 %[[VAL_17:.*]]:2 = hlfir.declare %[[VAL_15]] {uniq_name = "_QFsimple_reduction_switch_orderEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
99ca4dbc27SSergio Afonso! CHECK:                 fir.store %[[VAL_16]] to %[[VAL_11]]#1 : !fir.ref<i32>
100f46f5a01STom Eccles! CHECK:                 %[[VAL_18:.*]] = fir.load %[[VAL_11]]#0 : !fir.ref<i32>
101f46f5a01STom Eccles! CHECK:                 %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
102f46f5a01STom Eccles! CHECK:                 %[[VAL_20:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_19]])  : (!fir.ref<!fir.array<100x!fir.logical<4>>>, i64) -> !fir.ref<!fir.logical<4>>
103f46f5a01STom Eccles! CHECK:                 %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<!fir.logical<4>>
104f46f5a01STom Eccles! CHECK:                 %[[VAL_22:.*]] = fir.load %[[VAL_17]]#0 : !fir.ref<!fir.logical<4>>
105f46f5a01STom Eccles! CHECK:                 %[[VAL_23:.*]] = fir.convert %[[VAL_21]] : (!fir.logical<4>) -> i1
106f46f5a01STom Eccles! CHECK:                 %[[VAL_24:.*]] = fir.convert %[[VAL_22]] : (!fir.logical<4>) -> i1
107f46f5a01STom Eccles! CHECK:                 %[[VAL_25:.*]] = arith.cmpi ne, %[[VAL_23]], %[[VAL_24]] : i1
108f46f5a01STom Eccles! CHECK:                 %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i1) -> !fir.logical<4>
109f46f5a01STom Eccles! CHECK:                 hlfir.assign %[[VAL_26]] to %[[VAL_17]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
110f46f5a01STom Eccles! CHECK:                 omp.yield
111f46f5a01STom Eccles! CHECK:             omp.terminator
112f46f5a01STom Eccles! CHECK:           return
113f46f5a01STom Eccles
114f46f5a01STom Eccles
115f46f5a01STom Ecclessubroutine simple_reduction_switch_order(y)
116f46f5a01STom Eccles  logical :: x, y(100)
117f46f5a01STom Eccles  x = .true.
118f46f5a01STom Eccles  !$omp parallel
119f46f5a01STom Eccles  !$omp do reduction(.neqv.:x)
120f46f5a01STom Eccles  do i=1, 100
121f46f5a01STom Eccles  x = y(i) .neqv. x
122f46f5a01STom Eccles  end do
123f46f5a01STom Eccles  !$omp end do
124f46f5a01STom Eccles  !$omp end parallel
125f46f5a01STom Ecclesend subroutine
126f46f5a01STom Eccles
127f46f5a01STom Eccles
128f46f5a01STom Eccles! CHECK-LABEL:   func.func @_QPmultiple_reductions(
129f46f5a01STom Eccles! CHECK-SAME:                                      %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "w"}) {
130f46f5a01STom Eccles! CHECK:           %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFmultiple_reductionsEi"}
131f46f5a01STom Eccles! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFmultiple_reductionsEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
132f46f5a01STom Eccles! CHECK:           %[[VAL_3:.*]] = arith.constant 100 : index
133f46f5a01STom Eccles! CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
1341710c8cfSSlava Zakharin! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_4]]) dummy_scope %{{[0-9]+}} {uniq_name = "_QFmultiple_reductionsEw"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>)
135f46f5a01STom Eccles! CHECK:           %[[VAL_6:.*]] = fir.alloca !fir.logical<4> {bindc_name = "x", uniq_name = "_QFmultiple_reductionsEx"}
136f46f5a01STom Eccles! CHECK:           %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] {uniq_name = "_QFmultiple_reductionsEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
137f46f5a01STom Eccles! CHECK:           %[[VAL_8:.*]] = fir.alloca !fir.logical<4> {bindc_name = "y", uniq_name = "_QFmultiple_reductionsEy"}
138f46f5a01STom Eccles! CHECK:           %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] {uniq_name = "_QFmultiple_reductionsEy"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
139f46f5a01STom Eccles! CHECK:           %[[VAL_10:.*]] = fir.alloca !fir.logical<4> {bindc_name = "z", uniq_name = "_QFmultiple_reductionsEz"}
140f46f5a01STom Eccles! CHECK:           %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]] {uniq_name = "_QFmultiple_reductionsEz"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
141f46f5a01STom Eccles! CHECK:           %[[VAL_12:.*]] = arith.constant true
142f46f5a01STom Eccles! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i1) -> !fir.logical<4>
143f46f5a01STom Eccles! CHECK:           hlfir.assign %[[VAL_13]] to %[[VAL_7]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
144f46f5a01STom Eccles! CHECK:           %[[VAL_14:.*]] = arith.constant true
145f46f5a01STom Eccles! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i1) -> !fir.logical<4>
146f46f5a01STom Eccles! CHECK:           hlfir.assign %[[VAL_15]] to %[[VAL_9]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
147f46f5a01STom Eccles! CHECK:           %[[VAL_16:.*]] = arith.constant true
148f46f5a01STom Eccles! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i1) -> !fir.logical<4>
149f46f5a01STom Eccles! CHECK:           hlfir.assign %[[VAL_17]] to %[[VAL_11]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
150f46f5a01STom Eccles! CHECK:           omp.parallel {
151*937cbce1SKareem Ergawy! CHECK:             %[[VAL_18:.*]] = fir.alloca i32 {bindc_name = "i", pinned, {{.*}}}
152*937cbce1SKareem Ergawy! CHECK:             %[[VAL_19:.*]]:2 = hlfir.declare %[[VAL_18]] {uniq_name = "_QFmultiple_reductionsEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
153f46f5a01STom Eccles! CHECK:             %[[VAL_20:.*]] = arith.constant 1 : i32
154f46f5a01STom Eccles! CHECK:             %[[VAL_21:.*]] = arith.constant 100 : i32
155f46f5a01STom Eccles! CHECK:             %[[VAL_22:.*]] = arith.constant 1 : i32
156*937cbce1SKareem Ergawy! CHECK:             omp.wsloop reduction(byref @neqv_reduction %[[VAL_7]]#0 -> %[[VAL_23:.*]], byref @neqv_reduction %[[VAL_9]]#0 -> %[[VAL_24:.*]], byref @neqv_reduction %[[VAL_11]]#0 -> %[[VAL_25:.*]] : !fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>) {
157ca4dbc27SSergio Afonso! CHECK-NEXT:          omp.loop_nest (%[[VAL_26:.*]]) : i32 = (%[[VAL_20]]) to (%[[VAL_21]]) inclusive step (%[[VAL_22]]) {
158f46f5a01STom Eccles! CHECK:                 %[[VAL_27:.*]]:2 = hlfir.declare %[[VAL_23]] {uniq_name = "_QFmultiple_reductionsEx"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
159f46f5a01STom Eccles! CHECK:                 %[[VAL_28:.*]]:2 = hlfir.declare %[[VAL_24]] {uniq_name = "_QFmultiple_reductionsEy"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
160f46f5a01STom Eccles! CHECK:                 %[[VAL_29:.*]]:2 = hlfir.declare %[[VAL_25]] {uniq_name = "_QFmultiple_reductionsEz"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
161ca4dbc27SSergio Afonso! CHECK:                 fir.store %[[VAL_26]] to %[[VAL_19]]#1 : !fir.ref<i32>
162f46f5a01STom Eccles! CHECK:                 %[[VAL_30:.*]] = fir.load %[[VAL_27]]#0 : !fir.ref<!fir.logical<4>>
163f46f5a01STom Eccles! CHECK:                 %[[VAL_31:.*]] = fir.load %[[VAL_19]]#0 : !fir.ref<i32>
164f46f5a01STom Eccles! CHECK:                 %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i32) -> i64
165f46f5a01STom Eccles! CHECK:                 %[[VAL_33:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_32]])  : (!fir.ref<!fir.array<100x!fir.logical<4>>>, i64) -> !fir.ref<!fir.logical<4>>
166f46f5a01STom Eccles! CHECK:                 %[[VAL_34:.*]] = fir.load %[[VAL_33]] : !fir.ref<!fir.logical<4>>
167f46f5a01STom Eccles! CHECK:                 %[[VAL_35:.*]] = fir.convert %[[VAL_30]] : (!fir.logical<4>) -> i1
168f46f5a01STom Eccles! CHECK:                 %[[VAL_36:.*]] = fir.convert %[[VAL_34]] : (!fir.logical<4>) -> i1
169f46f5a01STom Eccles! CHECK:                 %[[VAL_37:.*]] = arith.cmpi ne, %[[VAL_35]], %[[VAL_36]] : i1
170f46f5a01STom Eccles! CHECK:                 %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i1) -> !fir.logical<4>
171f46f5a01STom Eccles! CHECK:                 hlfir.assign %[[VAL_38]] to %[[VAL_27]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
172f46f5a01STom Eccles! CHECK:                 %[[VAL_39:.*]] = fir.load %[[VAL_28]]#0 : !fir.ref<!fir.logical<4>>
173f46f5a01STom Eccles! CHECK:                 %[[VAL_40:.*]] = fir.load %[[VAL_19]]#0 : !fir.ref<i32>
174f46f5a01STom Eccles! CHECK:                 %[[VAL_41:.*]] = fir.convert %[[VAL_40]] : (i32) -> i64
175f46f5a01STom Eccles! CHECK:                 %[[VAL_42:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_41]])  : (!fir.ref<!fir.array<100x!fir.logical<4>>>, i64) -> !fir.ref<!fir.logical<4>>
176f46f5a01STom Eccles! CHECK:                 %[[VAL_43:.*]] = fir.load %[[VAL_42]] : !fir.ref<!fir.logical<4>>
177f46f5a01STom Eccles! CHECK:                 %[[VAL_44:.*]] = fir.convert %[[VAL_39]] : (!fir.logical<4>) -> i1
178f46f5a01STom Eccles! CHECK:                 %[[VAL_45:.*]] = fir.convert %[[VAL_43]] : (!fir.logical<4>) -> i1
179f46f5a01STom Eccles! CHECK:                 %[[VAL_46:.*]] = arith.cmpi ne, %[[VAL_44]], %[[VAL_45]] : i1
180f46f5a01STom Eccles! CHECK:                 %[[VAL_47:.*]] = fir.convert %[[VAL_46]] : (i1) -> !fir.logical<4>
181f46f5a01STom Eccles! CHECK:                 hlfir.assign %[[VAL_47]] to %[[VAL_28]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
182f46f5a01STom Eccles! CHECK:                 %[[VAL_48:.*]] = fir.load %[[VAL_29]]#0 : !fir.ref<!fir.logical<4>>
183f46f5a01STom Eccles! CHECK:                 %[[VAL_49:.*]] = fir.load %[[VAL_19]]#0 : !fir.ref<i32>
184f46f5a01STom Eccles! CHECK:                 %[[VAL_50:.*]] = fir.convert %[[VAL_49]] : (i32) -> i64
185f46f5a01STom Eccles! CHECK:                 %[[VAL_51:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_50]])  : (!fir.ref<!fir.array<100x!fir.logical<4>>>, i64) -> !fir.ref<!fir.logical<4>>
186f46f5a01STom Eccles! CHECK:                 %[[VAL_52:.*]] = fir.load %[[VAL_51]] : !fir.ref<!fir.logical<4>>
187f46f5a01STom Eccles! CHECK:                 %[[VAL_53:.*]] = fir.convert %[[VAL_48]] : (!fir.logical<4>) -> i1
188f46f5a01STom Eccles! CHECK:                 %[[VAL_54:.*]] = fir.convert %[[VAL_52]] : (!fir.logical<4>) -> i1
189f46f5a01STom Eccles! CHECK:                 %[[VAL_55:.*]] = arith.cmpi ne, %[[VAL_53]], %[[VAL_54]] : i1
190f46f5a01STom Eccles! CHECK:                 %[[VAL_56:.*]] = fir.convert %[[VAL_55]] : (i1) -> !fir.logical<4>
191f46f5a01STom Eccles! CHECK:                 hlfir.assign %[[VAL_56]] to %[[VAL_29]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
192f46f5a01STom Eccles! CHECK:                 omp.yield
193f46f5a01STom Eccles! CHECK:             omp.terminator
194f46f5a01STom Eccles! CHECK:           return
195f46f5a01STom Eccles! CHECK:         }
196f46f5a01STom Eccles
197f46f5a01STom Eccles
198f46f5a01STom Ecclessubroutine multiple_reductions(w)
199f46f5a01STom Eccles  logical :: x,y,z,w(100)
200f46f5a01STom Eccles  x = .true.
201f46f5a01STom Eccles  y = .true.
202f46f5a01STom Eccles  z = .true.
203f46f5a01STom Eccles  !$omp parallel
204f46f5a01STom Eccles  !$omp do reduction(.neqv.:x,y,z)
205f46f5a01STom Eccles  do i=1, 100
206f46f5a01STom Eccles  x = x .neqv. w(i)
207f46f5a01STom Eccles  y = y .neqv. w(i)
208f46f5a01STom Eccles  z = z .neqv. w(i)
209f46f5a01STom Eccles  end do
210f46f5a01STom Eccles  !$omp end do
211f46f5a01STom Eccles  !$omp end parallel
212f46f5a01STom Ecclesend subroutine
213