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