146 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! NOTE: Assertions have been autogenerated by utils/generate-test-checks.py5 6! CHECK-LABEL: omp.declare_reduction @max_f32 : f32 init {7! CHECK: ^bb0(%[[VAL_0:.*]]: f32):8! CHECK: %[[VAL_1:.*]] = arith.constant -3.40282347E+38 : f329! CHECK: omp.yield(%[[VAL_1]] : f32)10 11! CHECK-LABEL: } combiner {12! CHECK: ^bb0(%[[VAL_0:.*]]: f32, %[[VAL_1:.*]]: f32):13! CHECK: %[[VAL_2:.*]] = arith.maxnumf %[[VAL_0]], %[[VAL_1]] fastmath<contract> : f3214! CHECK: omp.yield(%[[VAL_2]] : f32)15! CHECK: }16 17! CHECK-LABEL: omp.declare_reduction @max_i32 : i32 init {18! CHECK: ^bb0(%[[VAL_0:.*]]: i32):19! CHECK: %[[VAL_1:.*]] = arith.constant -2147483648 : i3220! CHECK: omp.yield(%[[VAL_1]] : i32)21 22! CHECK-LABEL: } combiner {23! CHECK: ^bb0(%[[VAL_0:.*]]: i32, %[[VAL_1:.*]]: i32):24! CHECK: %[[VAL_2:.*]] = arith.maxsi %[[VAL_0]], %[[VAL_1]] : i3225! CHECK: omp.yield(%[[VAL_2]] : i32)26! CHECK: }27 28! CHECK-LABEL: func.func @_QPreduction_max_int(29! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {30! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFreduction_max_intEi"}31! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFreduction_max_intEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)32! CHECK: %[[VAL_3:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFreduction_max_intEx"}33! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_3]] {uniq_name = "_QFreduction_max_intEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)34! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFreduction_max_intEy"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)35! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i3236! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_4]]#0 : i32, !fir.ref<i32>37! CHECK: omp.parallel {38! CHECK: %[[VAL_9:.*]] = arith.constant 1 : i3239! CHECK: %[[VAL_10:.*]] = arith.constant 100 : i3240! CHECK: %[[VAL_11:.*]] = arith.constant 1 : i3241! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[VAL_7:.*]] : !fir.ref<i32>) reduction(@max_i32 %[[VAL_4]]#0 -> %[[VAL_12:.*]] : !fir.ref<i32>) {42! CHECK-NEXT: omp.loop_nest (%[[VAL_13:.*]]) : i32 = (%[[VAL_9]]) to (%[[VAL_10]]) inclusive step (%[[VAL_11]]) {43! CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_7]] {uniq_name = "_QFreduction_max_intEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)44! CHECK: %[[VAL_14:.*]]:2 = hlfir.declare %[[VAL_12]] {uniq_name = "_QFreduction_max_intEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)45! CHECK: hlfir.assign %[[VAL_13]] to %[[VAL_8]]#0 : i32, !fir.ref<i32>46! CHECK-DAG: %[[VAL_15:.*]] = fir.load %[[VAL_8]]#0 : !fir.ref<i32>47! CHECK-DAG: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i6448! CHECK-DAG: %[[VAL_17:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_16]]) : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>49! CHECK-DAG: %[[VAL_18:.*]] = fir.load %[[VAL_14]]#0 : !fir.ref<i32>50! CHECK-DAG: %[[VAL_19:.*]] = fir.load %[[VAL_17]] : !fir.ref<i32>51! CHECK: %[[VAL_20:.*]] = arith.cmpi sgt, %[[VAL_18]], %[[VAL_19]] : i3252! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_18]], %[[VAL_19]] : i3253! CHECK: hlfir.assign %[[VAL_21]] to %[[VAL_14]]#0 : i32, !fir.ref<i32>54! CHECK: omp.yield55! CHECK: omp.terminator56 57! CHECK-LABEL: func.func @_QPreduction_max_real(58! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "y"}) {59! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFreduction_max_realEi"}60! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFreduction_max_realEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)61! CHECK: %[[VAL_3:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFreduction_max_realEx"}62! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_3]] {uniq_name = "_QFreduction_max_realEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)63! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFreduction_max_realEy"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)64! CHECK: %[[VAL_6:.*]] = arith.constant 0.000000e+00 : f3265! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_4]]#0 : f32, !fir.ref<f32>66! CHECK: omp.parallel {67! CHECK: %[[VAL_9:.*]] = arith.constant 1 : i3268! CHECK: %[[VAL_10:.*]] = arith.constant 100 : i3269! CHECK: %[[VAL_11:.*]] = arith.constant 1 : i3270! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[VAL_7:.*]] : !fir.ref<i32>) reduction(@max_f32 %[[VAL_4]]#0 -> %[[VAL_12:.*]] : !fir.ref<f32>) {71! CHECK-NEXT: omp.loop_nest (%[[VAL_13:.*]]) : i32 = (%[[VAL_9]]) to (%[[VAL_10]]) inclusive step (%[[VAL_11]]) {72! CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_7]] {uniq_name = "_QFreduction_max_realEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)73! CHECK: %[[VAL_14:.*]]:2 = hlfir.declare %[[VAL_12]] {uniq_name = "_QFreduction_max_realEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)74! CHECK: hlfir.assign %[[VAL_13]] to %[[VAL_8]]#0 : i32, !fir.ref<i32>75! CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_8]]#0 : !fir.ref<i32>76! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i6477! CHECK: %[[VAL_17:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_16]]) : (!fir.box<!fir.array<?xf32>>, i64) -> !fir.ref<f32>78! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_17]] : !fir.ref<f32>79! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_14]]#0 : !fir.ref<f32>80! CHECK: %[[VAL_20:.*]] = arith.cmpf ogt, %[[VAL_18]], %[[VAL_19]] fastmath<contract> : f3281! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_18]], %[[VAL_19]] : f3282! CHECK: hlfir.assign %[[VAL_21]] to %[[VAL_14]]#0 : f32, !fir.ref<f32>83! CHECK: omp.yield84! CHECK: omp.terminator85! CHECK: omp.parallel {86! CHECK: %[[VAL_32:.*]] = arith.constant 1 : i3287! CHECK: %[[VAL_33:.*]] = arith.constant 100 : i3288! CHECK: %[[VAL_34:.*]] = arith.constant 1 : i3289! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[VAL_30:.*]] : !fir.ref<i32>) reduction(@max_f32 %[[VAL_4]]#0 -> %[[VAL_35:.*]] : !fir.ref<f32>) {90! CHECK-NEXT: omp.loop_nest (%[[VAL_36:.*]]) : i32 = (%[[VAL_32]]) to (%[[VAL_33]]) inclusive step (%[[VAL_34]]) {91! CHECK: %[[VAL_31:.*]]:2 = hlfir.declare %[[VAL_30]] {uniq_name = "_QFreduction_max_realEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)92! CHECK: %[[VAL_37:.*]]:2 = hlfir.declare %[[VAL_35]] {uniq_name = "_QFreduction_max_realEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)93! CHECK: hlfir.assign %[[VAL_36]] to %[[VAL_31]]#0 : i32, !fir.ref<i32>94! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_31]]#0 : !fir.ref<i32>95! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i32) -> i6496! CHECK: %[[VAL_40:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_39]]) : (!fir.box<!fir.array<?xf32>>, i64) -> !fir.ref<f32>97! CHECK: %[[VAL_41:.*]] = fir.load %[[VAL_40]] : !fir.ref<f32>98! CHECK: %[[VAL_42:.*]] = fir.load %[[VAL_37]]#0 : !fir.ref<f32>99! CHECK: %[[VAL_43:.*]] = arith.cmpf ogt, %[[VAL_41]], %[[VAL_42]] fastmath<contract> : f32100! CHECK: fir.if %[[VAL_43]] {101! CHECK: %[[VAL_44:.*]] = fir.load %[[VAL_31]]#0 : !fir.ref<i32>102! CHECK: %[[VAL_45:.*]] = fir.convert %[[VAL_44]] : (i32) -> i64103! CHECK: %[[VAL_46:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_45]]) : (!fir.box<!fir.array<?xf32>>, i64) -> !fir.ref<f32>104! CHECK: %[[VAL_47:.*]] = fir.load %[[VAL_46]] : !fir.ref<f32>105! CHECK: hlfir.assign %[[VAL_47]] to %[[VAL_37]]#0 : f32, !fir.ref<f32>106! CHECK: }107! CHECK: omp.yield108! CHECK: omp.terminator109 110 111 112subroutine reduction_max_int(y)113 integer :: x, y(:)114 x = 0115 !$omp parallel116 !$omp do reduction(max:x)117 do i=1, 100118 x = max(x, y(i))119 end do120 !$omp end do121 !$omp end parallel122 print *, x123end subroutine124 125subroutine reduction_max_real(y)126 real :: x, y(:)127 x = 0.0128 !$omp parallel129 !$omp do reduction(max:x)130 do i=1, 100131 x = max(y(i), x)132 end do133 !$omp end do134 !$omp end parallel135 print *, x136 137 !$omp parallel138 !$omp do reduction(max:x)139 do i=1, 100140 if (y(i) .gt. x) x = y(i)141 end do142 !$omp end do143 !$omp end parallel144 print *, x145end subroutine146