! RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s ! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s !CHECK-LABEL: omp.reduction.declare !CHECK-SAME: @[[RED_I32_NAME:.*]] : i32 init { !CHECK: ^bb0(%{{.*}}: i32): !CHECK: %[[C0_1:.*]] = arith.constant 0 : i32 !CHECK: omp.yield(%[[C0_1]] : i32) !CHECK: } combiner { !CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32): !CHECK: %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i32 !CHECK: omp.yield(%[[RES]] : i32) !CHECK: } !CHECK-LABEL: func.func @_QPsimple_int_reduction !CHECK: %[[XREF:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFsimple_int_reductionEx"} !CHECK: %[[XDECL:.*]]:2 = hlfir.declare %[[XREF]] {uniq_name = "_QFsimple_int_reductionEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[C0_2:.*]] = arith.constant 0 : i32 !CHECK: hlfir.assign %[[C0_2]] to %[[XDECL]]#0 : i32, !fir.ref !CHECK: omp.parallel !CHECK: %[[I_PVT_REF:.*]] = fir.alloca i32 {adapt.valuebyref, pinned} !CHECK: %[[I_PVT_DECL:.*]]:2 = hlfir.declare %[[I_PVT_REF]] {uniq_name = "_QFsimple_int_reductionEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[C1_1:.*]] = arith.constant 1 : i32 !CHECK: %[[C100:.*]] = arith.constant 100 : i32 !CHECK: %[[C1_2:.*]] = arith.constant 1 : i32 !CHECK: omp.wsloop reduction(@[[RED_I32_NAME]] -> %[[XDECL]]#0 : !fir.ref) for (%[[IVAL:.*]]) : i32 = (%[[C1_1]]) to (%[[C100]]) inclusive step (%[[C1_2]]) !CHECK: fir.store %[[IVAL]] to %[[I_PVT_DECL]]#1 : !fir.ref !CHECK: %[[I_PVT_VAL:.*]] = fir.load %[[I_PVT_DECL]]#0 : !fir.ref !CHECK: omp.reduction %[[I_PVT_VAL]], %[[XDECL]]#0 : i32, !fir.ref !CHECK: omp.yield !CHECK: omp.terminator !CHECK: return subroutine simple_int_reduction integer :: x x = 0 !$omp parallel !$omp do reduction(+:x) do i=1, 100 x = x + i end do !$omp end do !$omp end parallel end subroutine