| 
 | 1 | +// Tests mapping reductions from fir to OpenMP (all regions).  | 
 | 2 | + | 
 | 3 | +// RUN: fir-opt --omp-do-concurrent-conversion="map-to=host" %s | FileCheck %s  | 
 | 4 | + | 
 | 5 | +fir.declare_reduction @add_reduction_i32 : i32 init {  | 
 | 6 | +^bb0(%arg0: i32):  | 
 | 7 | +  fir.yield(%arg0 : i32)  | 
 | 8 | +} combiner {  | 
 | 9 | +^bb0(%arg0: i32, %arg1: i32):  | 
 | 10 | +  fir.yield(%arg0 : i32)  | 
 | 11 | +} atomic {  | 
 | 12 | +^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<i32>):  | 
 | 13 | +  fir.yield(%arg0 : !fir.ref<i32>)  | 
 | 14 | +} cleanup {  | 
 | 15 | +^bb0(%arg0: i32):  | 
 | 16 | +  fir.yield  | 
 | 17 | +}  | 
 | 18 | + | 
 | 19 | +func.func @_QPdo_concurrent_reduce() {  | 
 | 20 | +  %3 = fir.alloca i32 {bindc_name = "s", uniq_name = "_QFdo_concurrent_reduceEs"}  | 
 | 21 | +  %4:2 = hlfir.declare %3 {uniq_name = "_QFdo_concurrent_reduceEs"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)  | 
 | 22 | +  %c1 = arith.constant 1 : index  | 
 | 23 | +  fir.do_concurrent {  | 
 | 24 | +    %7 = fir.alloca i32 {bindc_name = "i"}  | 
 | 25 | +    %8:2 = hlfir.declare %7 {uniq_name = "_QFdo_concurrent_reduceEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)  | 
 | 26 | +    fir.do_concurrent.loop (%arg0) = (%c1) to (%c1) step (%c1) reduce(@add_reduction_i32 #fir.reduce_attr<add> %4#0 -> %arg1 : !fir.ref<i32>) {  | 
 | 27 | +      %9 = fir.convert %arg0 : (index) -> i32  | 
 | 28 | +      fir.store %9 to %8#0 : !fir.ref<i32>  | 
 | 29 | +    }  | 
 | 30 | +  }  | 
 | 31 | +  return  | 
 | 32 | +}  | 
 | 33 | + | 
 | 34 | +// CHECK-LABEL:   omp.declare_reduction @add_reduction_i32.omp : i32 init {  | 
 | 35 | +// CHECK:         ^bb0(%[[VAL_0:.*]]: i32):  | 
 | 36 | +// CHECK:           omp.yield(%[[VAL_0]] : i32)  | 
 | 37 | + | 
 | 38 | +// CHECK-LABEL:   } combiner {  | 
 | 39 | +// CHECK:         ^bb0(%[[VAL_0:.*]]: i32, %[[VAL_1:.*]]: i32):  | 
 | 40 | +// CHECK:           omp.yield(%[[VAL_0]] : i32)  | 
 | 41 | + | 
 | 42 | +// CHECK-LABEL:   } atomic {  | 
 | 43 | +// CHECK:         ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>, %[[VAL_1:.*]]: !fir.ref<i32>):  | 
 | 44 | +// CHECK:           omp.yield(%[[VAL_0]] : !fir.ref<i32>)  | 
 | 45 | + | 
 | 46 | +// CHECK-LABEL:   } cleanup {  | 
 | 47 | +// CHECK:         ^bb0(%[[VAL_0:.*]]: i32):  | 
 | 48 | +// CHECK:           omp.yield  | 
 | 49 | +// CHECK:         }  | 
 | 50 | + | 
 | 51 | +// CHECK-LABEL:   func.func @_QPdo_concurrent_reduce() {  | 
 | 52 | +// CHECK:           %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "i"}  | 
 | 53 | +// CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFdo_concurrent_reduceEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)  | 
 | 54 | +// CHECK:           %[[VAL_2:.*]] = fir.alloca i32 {bindc_name = "s", uniq_name = "_QFdo_concurrent_reduceEs"}  | 
 | 55 | +// CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {uniq_name = "_QFdo_concurrent_reduceEs"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)  | 
 | 56 | +// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : index  | 
 | 57 | +// CHECK:           omp.parallel {  | 
 | 58 | +// CHECK:             %[[VAL_5:.*]] = fir.alloca i32 {bindc_name = "i"}  | 
 | 59 | +// CHECK:             %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QFdo_concurrent_reduceEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)  | 
 | 60 | +// CHECK:             omp.wsloop reduction(@add_reduction_i32.omp %[[VAL_3]]#0 -> %[[VAL_7:.*]] : !fir.ref<i32>) {  | 
 | 61 | +// CHECK:               omp.loop_nest (%[[VAL_8:.*]]) : index = (%[[VAL_4]]) to (%[[VAL_4]]) inclusive step (%[[VAL_4]]) {  | 
 | 62 | +// CHECK:                 %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (index) -> i32  | 
 | 63 | +// CHECK:                 fir.store %[[VAL_9]] to %[[VAL_6]]#0 : !fir.ref<i32>  | 
 | 64 | +// CHECK:                 omp.yield  | 
 | 65 | +// CHECK:               }  | 
 | 66 | +// CHECK:             }  | 
 | 67 | +// CHECK:             omp.terminator  | 
 | 68 | +// CHECK:           }  | 
 | 69 | +// CHECK:           return  | 
 | 70 | +// CHECK:         }  | 
0 commit comments