xref: /llvm-project/flang/test/Lower/OpenMP/wsloop-reduction-multi.f90 (revision 937cbce14c9aa956342a9c818c26a8a557802843)
173402634SSergio Afonso! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
273402634SSergio Afonso! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
373402634SSergio Afonso
473402634SSergio Afonso!CHECK-LABEL: omp.declare_reduction
573402634SSergio Afonso!CHECK-SAME: @[[MIN_RED_I32_NAME:.*]] : i32 init {
673402634SSergio Afonso!CHECK: ^bb0(%{{.*}}: i32):
773402634SSergio Afonso!CHECK:  %[[C0_1:.*]] = arith.constant 2147483647 : i32
873402634SSergio Afonso!CHECK:  omp.yield(%[[C0_1]] : i32)
973402634SSergio Afonso!CHECK: } combiner {
1073402634SSergio Afonso!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32):
1173402634SSergio Afonso!CHECK:  %[[RES:.*]] = arith.minsi %[[ARG0]], %[[ARG1]] : i32
1273402634SSergio Afonso!CHECK:  omp.yield(%[[RES]] : i32)
1373402634SSergio Afonso!CHECK: }
1473402634SSergio Afonso
1573402634SSergio Afonso!CHECK-LABEL: omp.declare_reduction
1673402634SSergio Afonso!CHECK-SAME: @[[ADD_RED_F32_NAME:.*]] : f32 init {
1773402634SSergio Afonso!CHECK: ^bb0(%{{.*}}: f32):
1873402634SSergio Afonso!CHECK:   %[[C0_1:.*]] = arith.constant 0.000000e+00 : f32
1973402634SSergio Afonso!CHECK:   omp.yield(%[[C0_1]] : f32)
2073402634SSergio Afonso!CHECK: } combiner {
2173402634SSergio Afonso!CHECK: ^bb0(%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32):
2273402634SSergio Afonso!CHECK:   %[[RES:.*]] = arith.addf %[[ARG0]], %[[ARG1]] {{.*}} : f32
2373402634SSergio Afonso!CHECK:   omp.yield(%[[RES]] : f32)
2473402634SSergio Afonso!CHECK: }
2573402634SSergio Afonso
2673402634SSergio Afonso!CHECK-LABEL: omp.declare_reduction
2773402634SSergio Afonso!CHECK-SAME: @[[ADD_RED_I32_NAME:.*]] : i32 init {
2873402634SSergio Afonso!CHECK: ^bb0(%{{.*}}: i32):
2973402634SSergio Afonso!CHECK:  %[[C0_1:.*]] = arith.constant 0 : i32
3073402634SSergio Afonso!CHECK:  omp.yield(%[[C0_1]] : i32)
3173402634SSergio Afonso!CHECK: } combiner {
3273402634SSergio Afonso!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32):
3373402634SSergio Afonso!CHECK:  %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i32
3473402634SSergio Afonso!CHECK:  omp.yield(%[[RES]] : i32)
3573402634SSergio Afonso!CHECK: }
3673402634SSergio Afonso
3773402634SSergio Afonso!CHECK-LABEL: func.func @_QPmultiple_reduction
3873402634SSergio Afonso!CHECK:      %[[X_REF:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFmultiple_reductionEx"}
3973402634SSergio Afonso!CHECK:      %[[X_DECL:.*]]:2 = hlfir.declare %[[X_REF]] {uniq_name = "_QFmultiple_reductionEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
4073402634SSergio Afonso!CHECK:      %[[Y_REF:.*]] = fir.alloca f32 {bindc_name = "y", uniq_name = "_QFmultiple_reductionEy"}
4173402634SSergio Afonso!CHECK:      %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y_REF]] {uniq_name = "_QFmultiple_reductionEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
4273402634SSergio Afonso!CHECK:      %[[Z_REF:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFmultiple_reductionEz"}
4373402634SSergio Afonso!CHECK:      %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z_REF]] {uniq_name = "_QFmultiple_reductionEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
44*937cbce1SKareem Ergawy!CHECK:      omp.wsloop reduction(
45cdb3ebf1SSergio Afonso!CHECK-SAME: @[[ADD_RED_I32_NAME]] %[[X_DECL]]#0 -> %[[PRV_X:[^,]+]],
46cdb3ebf1SSergio Afonso!CHECK-SAME: @[[ADD_RED_F32_NAME]] %[[Y_DECL]]#0 -> %[[PRV_Y:[^,]+]],
47cdb3ebf1SSergio Afonso!CHECK-SAME: @[[MIN_RED_I32_NAME]] %[[Z_DECL]]#0 -> %[[PRV_Z:.+]] :
48cdb3ebf1SSergio Afonso!CHECK-SAME: !fir.ref<i32>, !fir.ref<f32>, !fir.ref<i32>) {
49ca4dbc27SSergio Afonso!CHECK-NEXT:   omp.loop_nest {{.*}} {
5073402634SSergio Afonso!CHECK:          %[[PRV_X_DECL:.+]]:2 = hlfir.declare %[[PRV_X]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
5173402634SSergio Afonso!CHECK:          %[[PRV_Y_DECL:.+]]:2 = hlfir.declare %[[PRV_Y]] {{.*}} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
5273402634SSergio Afonso!CHECK:          %[[PRV_Z_DECL:.+]]:2 = hlfir.declare %[[PRV_Z]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
5373402634SSergio Afonso!CHECK:          %[[LPRV_X:.+]] = fir.load %[[PRV_X_DECL]]#0 : !fir.ref<i32>
5473402634SSergio Afonso!CHECK:          %[[RES_X:.+]] = arith.addi %[[LPRV_X]], %{{.+}} : i32
5573402634SSergio Afonso!CHECK:          hlfir.assign %[[RES_X]] to %[[PRV_X_DECL]]#0 : i32, !fir.ref<i32>
5673402634SSergio Afonso!CHECK:          %[[LPRV_Y:.+]] = fir.load %[[PRV_Y_DECL]]#0 : !fir.ref<f32>
5773402634SSergio Afonso!CHECK:          %[[RES_Y:.+]] = arith.addf %[[LPRV_Y]], %{{.+}} : f32
5873402634SSergio Afonso!CHECK:          hlfir.assign %[[RES_Y]] to %[[PRV_Y_DECL]]#0 : f32, !fir.ref<f32>
5973402634SSergio Afonso!CHECK:          %[[LPRV_Z:.+]] = fir.load %[[PRV_Z_DECL]]#0 : !fir.ref<i32>
6073402634SSergio Afonso!CHECK:          %[[RES_Z:.+]] = arith.select %{{.+}}, %[[LPRV_Z]], %{{.+}} : i32
6173402634SSergio Afonso!CHECK:          hlfir.assign %[[RES_Z]] to %[[PRV_Z_DECL]]#0 : i32, !fir.ref<i32>
6273402634SSergio Afonso!CHECK:          omp.yield
6373402634SSergio Afonso!CHECK:        }
64ca4dbc27SSergio Afonso!CHECK:      }
6573402634SSergio Afonso!CHECK:      return
6673402634SSergio Afonsosubroutine multiple_reduction(v)
6773402634SSergio Afonso  implicit none
6873402634SSergio Afonso  integer, intent(in) :: v(:)
6973402634SSergio Afonso  integer :: i
7073402634SSergio Afonso  integer :: x
7173402634SSergio Afonso  real :: y
7273402634SSergio Afonso  integer:: z
7373402634SSergio Afonso  x = 0
7473402634SSergio Afonso  y = 0.0
7573402634SSergio Afonso  z = 10
7673402634SSergio Afonso
7773402634SSergio Afonso  !$omp do reduction(+:x,y) reduction(min:z)
7873402634SSergio Afonso  do i=1, 100
7973402634SSergio Afonso    x = x + v(i)
8073402634SSergio Afonso    y = y + 1.5 * v(i)
8173402634SSergio Afonso    z = min(z, v(i))
8273402634SSergio Afonso  end do
8373402634SSergio Afonso  !$omp end do
8473402634SSergio Afonsoend subroutine
85