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