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