85 lines · plain
1! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s2! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s3 4!CHECK-LABEL: omp.declare_reduction5!CHECK-SAME: @[[MIN_RED_I32_NAME:.*]] : i32 init {6!CHECK: ^bb0(%{{.*}}: i32):7!CHECK: %[[C0_1:.*]] = arith.constant 2147483647 : i328!CHECK: omp.yield(%[[C0_1]] : i32)9!CHECK: } combiner {10!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32):11!CHECK: %[[RES:.*]] = arith.minsi %[[ARG0]], %[[ARG1]] : i3212!CHECK: omp.yield(%[[RES]] : i32)13!CHECK: }14 15!CHECK-LABEL: omp.declare_reduction16!CHECK-SAME: @[[ADD_RED_F32_NAME:.*]] : f32 init {17!CHECK: ^bb0(%{{.*}}: f32):18!CHECK: %[[C0_1:.*]] = arith.constant 0.000000e+00 : f3219!CHECK: omp.yield(%[[C0_1]] : f32)20!CHECK: } combiner {21!CHECK: ^bb0(%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32):22!CHECK: %[[RES:.*]] = arith.addf %[[ARG0]], %[[ARG1]] {{.*}} : f3223!CHECK: omp.yield(%[[RES]] : f32)24!CHECK: }25 26!CHECK-LABEL: omp.declare_reduction27!CHECK-SAME: @[[ADD_RED_I32_NAME:.*]] : i32 init {28!CHECK: ^bb0(%{{.*}}: i32):29!CHECK: %[[C0_1:.*]] = arith.constant 0 : i3230!CHECK: omp.yield(%[[C0_1]] : i32)31!CHECK: } combiner {32!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32):33!CHECK: %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i3234!CHECK: omp.yield(%[[RES]] : i32)35!CHECK: }36 37!CHECK-LABEL: func.func @_QPmultiple_reduction38!CHECK: %[[X_REF:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFmultiple_reductionEx"}39!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X_REF]] {uniq_name = "_QFmultiple_reductionEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)40!CHECK: %[[Y_REF:.*]] = fir.alloca f32 {bindc_name = "y", uniq_name = "_QFmultiple_reductionEy"}41!CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y_REF]] {uniq_name = "_QFmultiple_reductionEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)42!CHECK: %[[Z_REF:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFmultiple_reductionEz"}43!CHECK: %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z_REF]] {uniq_name = "_QFmultiple_reductionEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)44!CHECK: omp.wsloop private({{.*}}) reduction(45!CHECK-SAME: @[[ADD_RED_I32_NAME]] %[[X_DECL]]#0 -> %[[PRV_X:[^,]+]],46!CHECK-SAME: @[[ADD_RED_F32_NAME]] %[[Y_DECL]]#0 -> %[[PRV_Y:[^,]+]],47!CHECK-SAME: @[[MIN_RED_I32_NAME]] %[[Z_DECL]]#0 -> %[[PRV_Z:.+]] :48!CHECK-SAME: !fir.ref<i32>, !fir.ref<f32>, !fir.ref<i32>) {49!CHECK-NEXT: omp.loop_nest {{.*}} {50!CHECK: %[[PRV_X_DECL:.+]]:2 = hlfir.declare %[[PRV_X]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)51!CHECK: %[[PRV_Y_DECL:.+]]:2 = hlfir.declare %[[PRV_Y]] {{.*}} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)52!CHECK: %[[PRV_Z_DECL:.+]]:2 = hlfir.declare %[[PRV_Z]] {{.*}} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)53!CHECK: %[[LPRV_X:.+]] = fir.load %[[PRV_X_DECL]]#0 : !fir.ref<i32>54!CHECK: %[[RES_X:.+]] = arith.addi %[[LPRV_X]], %{{.+}} : i3255!CHECK: hlfir.assign %[[RES_X]] to %[[PRV_X_DECL]]#0 : i32, !fir.ref<i32>56!CHECK: %[[LPRV_Y:.+]] = fir.load %[[PRV_Y_DECL]]#0 : !fir.ref<f32>57!CHECK: %[[RES_Y:.+]] = arith.addf %[[LPRV_Y]], %{{.+}} : f3258!CHECK: hlfir.assign %[[RES_Y]] to %[[PRV_Y_DECL]]#0 : f32, !fir.ref<f32>59!CHECK: %[[LPRV_Z:.+]] = fir.load %[[PRV_Z_DECL]]#0 : !fir.ref<i32>60!CHECK: %[[RES_Z:.+]] = arith.select %{{.+}}, %[[LPRV_Z]], %{{.+}} : i3261!CHECK: hlfir.assign %[[RES_Z]] to %[[PRV_Z_DECL]]#0 : i32, !fir.ref<i32>62!CHECK: omp.yield63!CHECK: }64!CHECK: }65!CHECK: return66subroutine multiple_reduction(v)67 implicit none68 integer, intent(in) :: v(:)69 integer :: i70 integer :: x71 real :: y72 integer:: z73 x = 074 y = 0.075 z = 1076 77 !$omp do reduction(+:x,y) reduction(min:z)78 do i=1, 10079 x = x + v(i)80 y = y + 1.5 * v(i)81 z = min(z, v(i))82 end do83 !$omp end do84end subroutine85