xref: /llvm-project/flang/test/Lower/OpenMP/parallel-reduction-add.f90 (revision cdb3ebf1e62df060767863e1e683409d6077ca6e)
13bfc5eb9SKiran Chandramohan! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
23bfc5eb9SKiran Chandramohan! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
33bfc5eb9SKiran Chandramohan
4d84252e0SSergio Afonso!CHECK-LABEL: omp.declare_reduction
53bfc5eb9SKiran Chandramohan!CHECK-SAME: @[[RED_F32_NAME:.*]] : f32 init {
63bfc5eb9SKiran Chandramohan!CHECK: ^bb0(%{{.*}}: f32):
73bfc5eb9SKiran Chandramohan!CHECK:  %[[C0_1:.*]] = arith.constant 0.000000e+00 : f32
83bfc5eb9SKiran Chandramohan!CHECK:  omp.yield(%[[C0_1]] : f32)
93bfc5eb9SKiran Chandramohan!CHECK: } combiner {
103bfc5eb9SKiran Chandramohan!CHECK: ^bb0(%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32):
113bfc5eb9SKiran Chandramohan!CHECK:  %[[RES:.*]] = arith.addf %[[ARG0]], %[[ARG1]] {{.*}}: f32
123bfc5eb9SKiran Chandramohan!CHECK:  omp.yield(%[[RES]] : f32)
133bfc5eb9SKiran Chandramohan!CHECK: }
143bfc5eb9SKiran Chandramohan
15d84252e0SSergio Afonso!CHECK-LABEL: omp.declare_reduction
163bfc5eb9SKiran Chandramohan!CHECK-SAME: @[[RED_I32_NAME:.*]] : i32 init {
173bfc5eb9SKiran Chandramohan!CHECK: ^bb0(%{{.*}}: i32):
183bfc5eb9SKiran Chandramohan!CHECK:  %[[C0_1:.*]] = arith.constant 0 : i32
193bfc5eb9SKiran Chandramohan!CHECK:  omp.yield(%[[C0_1]] : i32)
203bfc5eb9SKiran Chandramohan!CHECK: } combiner {
213bfc5eb9SKiran Chandramohan!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32):
223bfc5eb9SKiran Chandramohan!CHECK:  %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i32
233bfc5eb9SKiran Chandramohan!CHECK:  omp.yield(%[[RES]] : i32)
243bfc5eb9SKiran Chandramohan!CHECK: }
253bfc5eb9SKiran Chandramohan
263bfc5eb9SKiran Chandramohan!CHECK-LABEL: func.func @_QPsimple_int_add
273bfc5eb9SKiran Chandramohan!CHECK:  %[[IREF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_int_addEi"}
283bfc5eb9SKiran Chandramohan!CHECK:  %[[I_DECL:.*]]:2 = hlfir.declare %[[IREF]] {uniq_name = "_QFsimple_int_addEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
293bfc5eb9SKiran Chandramohan!CHECK:  %[[I_START:.*]] = arith.constant 0 : i32
303bfc5eb9SKiran Chandramohan!CHECK:  hlfir.assign %[[I_START]] to %[[I_DECL]]#0 : i32, !fir.ref<i32>
319ecf4d20SDavid Truby!CHECK:  omp.parallel reduction(@[[RED_I32_NAME]] %[[I_DECL]]#0 -> %[[PRV:.+]] : !fir.ref<i32>) {
329ecf4d20SDavid Truby!CHECK:    %[[P_DECL:.+]]:2 = hlfir.declare %[[PRV]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
339ecf4d20SDavid Truby!CHECK:    %[[LPRV:.+]] = fir.load %[[P_DECL]]#0 : !fir.ref<i32>
343bfc5eb9SKiran Chandramohan!CHECK:    %[[I_INCR:.*]] = arith.constant 1 : i32
359ecf4d20SDavid Truby!CHECK:    %[[RES:.+]] = arith.addi %[[LPRV]], %[[I_INCR]] : i32
369ecf4d20SDavid Truby!CHECK:    hlfir.assign %[[RES]] to %[[P_DECL]]#0 : i32, !fir.ref<i32>
373bfc5eb9SKiran Chandramohan!CHECK:    omp.terminator
383bfc5eb9SKiran Chandramohan!CHECK:  }
393bfc5eb9SKiran Chandramohan!CHECK: return
403bfc5eb9SKiran Chandramohansubroutine simple_int_add
413bfc5eb9SKiran Chandramohan    integer :: i
423bfc5eb9SKiran Chandramohan    i = 0
433bfc5eb9SKiran Chandramohan
443bfc5eb9SKiran Chandramohan    !$omp parallel reduction(+:i)
453bfc5eb9SKiran Chandramohan    i = i + 1
463bfc5eb9SKiran Chandramohan    !$omp end parallel
473bfc5eb9SKiran Chandramohan
483bfc5eb9SKiran Chandramohan    print *, i
493bfc5eb9SKiran Chandramohanend subroutine
503bfc5eb9SKiran Chandramohan
513bfc5eb9SKiran Chandramohan!CHECK-LABEL: func.func @_QPsimple_real_add
523bfc5eb9SKiran Chandramohan!CHECK:  %[[RREF:.*]] = fir.alloca f32 {bindc_name = "r", uniq_name = "_QFsimple_real_addEr"}
533bfc5eb9SKiran Chandramohan!CHECK:  %[[R_DECL:.*]]:2 = hlfir.declare %[[RREF]] {uniq_name = "_QFsimple_real_addEr"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
543bfc5eb9SKiran Chandramohan!CHECK:  %[[R_START:.*]] = arith.constant 0.000000e+00 : f32
553bfc5eb9SKiran Chandramohan!CHECK:  hlfir.assign %[[R_START]] to %[[R_DECL]]#0 : f32, !fir.ref<f32>
569ecf4d20SDavid Truby!CHECK:  omp.parallel reduction(@[[RED_F32_NAME]] %[[R_DECL]]#0 -> %[[PRV:.+]] : !fir.ref<f32>) {
579ecf4d20SDavid Truby!CHECK:    %[[P_DECL:.+]]:2 = hlfir.declare %[[PRV]] {{.*}} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
589ecf4d20SDavid Truby!CHECK:    %[[LPRV:.+]] = fir.load %[[P_DECL]]#0 : !fir.ref<f32>
593bfc5eb9SKiran Chandramohan!CHECK:    %[[R_INCR:.*]] = arith.constant 1.500000e+00 : f32
609ecf4d20SDavid Truby!CHECK:    %[[RES:.+]] = arith.addf %[[LPRV]], %[[R_INCR]] {{.*}} : f32
619ecf4d20SDavid Truby!CHECK:    hlfir.assign %[[RES]] to %[[P_DECL]]#0 : f32, !fir.ref<f32>
623bfc5eb9SKiran Chandramohan!CHECK:    omp.terminator
633bfc5eb9SKiran Chandramohan!CHECK:  }
643bfc5eb9SKiran Chandramohan!CHECK: return
653bfc5eb9SKiran Chandramohansubroutine simple_real_add
663bfc5eb9SKiran Chandramohan    real :: r
673bfc5eb9SKiran Chandramohan    r = 0.0
683bfc5eb9SKiran Chandramohan
693bfc5eb9SKiran Chandramohan    !$omp parallel reduction(+:r)
703bfc5eb9SKiran Chandramohan    r = r + 1.5
713bfc5eb9SKiran Chandramohan    !$omp end parallel
723bfc5eb9SKiran Chandramohan
733bfc5eb9SKiran Chandramohan    print *, r
743bfc5eb9SKiran Chandramohanend subroutine
753bfc5eb9SKiran Chandramohan
763bfc5eb9SKiran Chandramohan!CHECK-LABEL: func.func @_QPint_real_add
773bfc5eb9SKiran Chandramohan!CHECK:  %[[IREF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFint_real_addEi"}
783bfc5eb9SKiran Chandramohan!CHECK:  %[[I_DECL:.*]]:2 = hlfir.declare %[[IREF]] {uniq_name = "_QFint_real_addEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
793bfc5eb9SKiran Chandramohan!CHECK:  %[[RREF:.*]] = fir.alloca f32 {bindc_name = "r", uniq_name = "_QFint_real_addEr"}
803bfc5eb9SKiran Chandramohan!CHECK:  %[[R_DECL:.*]]:2 = hlfir.declare %[[RREF]] {uniq_name = "_QFint_real_addEr"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
813bfc5eb9SKiran Chandramohan!CHECK:  %[[R_START:.*]] = arith.constant 0.000000e+00 : f32
823bfc5eb9SKiran Chandramohan!CHECK:  hlfir.assign %[[R_START]] to %[[R_DECL]]#0 : f32, !fir.ref<f32>
833bfc5eb9SKiran Chandramohan!CHECK:  %[[I_START:.*]] = arith.constant 0 : i32
843bfc5eb9SKiran Chandramohan!CHECK:  hlfir.assign %[[I_START]] to %[[I_DECL]]#0 : i32, !fir.ref<i32>
85*cdb3ebf1SSergio Afonso!CHECK:  omp.parallel reduction(@[[RED_I32_NAME]] %[[I_DECL]]#0 -> %[[IPRV:.+]], @[[RED_F32_NAME]] %[[R_DECL]]#0 -> %[[RPRV:.+]] : !fir.ref<i32>, !fir.ref<f32>) {
869ecf4d20SDavid Truby!CHECK:    %[[IP_DECL:.+]]:2 = hlfir.declare %[[IPRV]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
879ecf4d20SDavid Truby!CHECK:    %[[RP_DECL:.+]]:2 = hlfir.declare %[[RPRV]] {{.*}} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
883bfc5eb9SKiran Chandramohan!CHECK:    %[[R_INCR:.*]] = arith.constant 1.500000e+00 : f32
899ecf4d20SDavid Truby!CHECK:    %[[R_LPRV:.+]] = fir.load %[[RP_DECL]]#0 : !fir.ref<f32>
909ecf4d20SDavid Truby!CHECK:    %[[RES1:.+]] = arith.addf %[[R_INCR]], %[[R_LPRV]] {{.*}} : f32
919ecf4d20SDavid Truby!CHECK:    hlfir.assign %[[RES1]] to %[[RP_DECL]]#0 : f32, !fir.ref<f32>
929ecf4d20SDavid Truby!CHECK:    %[[I_LPRV:.+]] = fir.load %[[IP_DECL]]#0 : !fir.ref<i32>
933bfc5eb9SKiran Chandramohan!CHECK:    %[[I_INCR:.*]] = arith.constant 3 : i32
949ecf4d20SDavid Truby!CHECK:    %[[RES0:.+]] = arith.addi %[[I_LPRV]], %[[I_INCR]] : i32
959ecf4d20SDavid Truby!CHECK:    hlfir.assign %[[RES0]] to %[[IP_DECL]]#0 : i32, !fir.ref<i32>
963bfc5eb9SKiran Chandramohan!CHECK:    omp.terminator
973bfc5eb9SKiran Chandramohan!CHECK:  }
983bfc5eb9SKiran Chandramohan!CHECK: return
993bfc5eb9SKiran Chandramohansubroutine int_real_add
1003bfc5eb9SKiran Chandramohan    real :: r
1013bfc5eb9SKiran Chandramohan    integer :: i
1023bfc5eb9SKiran Chandramohan
1033bfc5eb9SKiran Chandramohan    r = 0.0
1043bfc5eb9SKiran Chandramohan    i = 0
1053bfc5eb9SKiran Chandramohan
1063bfc5eb9SKiran Chandramohan    !$omp parallel reduction(+:i,r)
1073bfc5eb9SKiran Chandramohan    r = 1.5 + r
1083bfc5eb9SKiran Chandramohan    i = i + 3
1093bfc5eb9SKiran Chandramohan    !$omp end parallel
1103bfc5eb9SKiran Chandramohan
1113bfc5eb9SKiran Chandramohan    print *, r
1123bfc5eb9SKiran Chandramohan    print *, i
1133bfc5eb9SKiran Chandramohanend subroutine
114