185 lines · plain
1// Tests converting `fir.do_concurrent` ops to `fir.do_loop` ops.2 3// RUN: fir-opt --split-input-file --simplify-fir-operations %s | FileCheck %s4 5func.func @dc_1d(%i_lb: index, %i_ub: index, %i_st: index) {6 fir.do_concurrent {7 %i = fir.alloca i328 fir.do_concurrent.loop (%i_iv) = (%i_lb) to (%i_ub) step (%i_st) {9 %0 = fir.convert %i_iv : (index) -> i3210 fir.store %0 to %i : !fir.ref<i32>11 }12 }13 return14}15 16// CHECK-LABEL: func.func @dc_1d(17// CHECK-SAME: %[[I_LB:[^[:space:]]+]]: index,18// CHECK-SAME: %[[I_UB:[^[:space:]]+]]: index,19// CHECK-SAME: %[[I_ST:[^[:space:]]+]]: index) {20 21// CHECK: %[[I:.*]] = fir.alloca i3222 23// CHECK: fir.do_loop %[[I_IV:.*]] = %[[I_LB]] to %[[I_UB]] step %[[I_ST]] unordered {24// CHECK: %[[I_IV_CVT:.*]] = fir.convert %[[I_IV]] : (index) -> i3225// CHECK: fir.store %[[I_IV_CVT]] to %[[I]] : !fir.ref<i32>26// CHECK: }27 28// CHECK: return29// CHECK: }30 31// -----32 33func.func @dc_2d(%i_lb: index, %i_ub: index, %i_st: index,34 %j_lb: index, %j_ub: index, %j_st: index) {35 llvm.br ^bb136 37^bb1:38 fir.do_concurrent {39 %i = fir.alloca i3240 %j = fir.alloca i3241 fir.do_concurrent.loop42 (%i_iv, %j_iv) = (%i_lb, %j_lb) to (%i_ub, %j_ub) step (%i_st, %j_st) {43 %0 = fir.convert %i_iv : (index) -> i3244 fir.store %0 to %i : !fir.ref<i32>45 46 %1 = fir.convert %j_iv : (index) -> i3247 fir.store %1 to %j : !fir.ref<i32>48 }49 }50 return51}52 53// CHECK-LABEL: func.func @dc_2d(54// CHECK-SAME: %[[I_LB:[^[:space:]]+]]: index,55// CHECK-SAME: %[[I_UB:[^[:space:]]+]]: index,56// CHECK-SAME: %[[I_ST:[^[:space:]]+]]: index,57// CHECK-SAME: %[[J_LB:[^[:space:]]+]]: index,58// CHECK-SAME: %[[J_UB:[^[:space:]]+]]: index,59// CHECK-SAME: %[[J_ST:[^[:space:]]+]]: index) {60 61// CHECK: %[[I:.*]] = fir.alloca i3262// CHECK: %[[J:.*]] = fir.alloca i3263// CHECK: llvm.br ^bb164 65// CHECK: ^bb1:66// CHECK: fir.do_loop %[[I_IV:.*]] = %[[I_LB]] to %[[I_UB]] step %[[I_ST]] unordered {67// CHECK: fir.do_loop %[[J_IV:.*]] = %[[J_LB]] to %[[J_UB]] step %[[J_ST]] unordered {68// CHECK: %[[I_IV_CVT:.*]] = fir.convert %[[I_IV]] : (index) -> i3269// CHECK: fir.store %[[I_IV_CVT]] to %[[I]] : !fir.ref<i32>70// CHECK: %[[J_IV_CVT:.*]] = fir.convert %[[J_IV]] : (index) -> i3271// CHECK: fir.store %[[J_IV_CVT]] to %[[J]] : !fir.ref<i32>72// CHECK: }73// CHECK: }74 75// CHECK: return76// CHECK: }77 78// -----79 80func.func @dc_2d_reduction(%i_lb: index, %i_ub: index, %i_st: index,81 %j_lb: index, %j_ub: index, %j_st: index) {82 %sum = fir.alloca i3283 84 fir.do_concurrent {85 %i = fir.alloca i3286 %j = fir.alloca i3287 fir.do_concurrent.loop88 (%i_iv, %j_iv) = (%i_lb, %j_lb) to (%i_ub, %j_ub) step (%i_st, %j_st) 89 reduce(@add_reduction_i32 #fir.reduce_attr<add> %sum -> %sum_arg : !fir.ref<i32>) {90 %0 = fir.convert %i_iv : (index) -> i3291 fir.store %0 to %i : !fir.ref<i32>92 93 %1 = fir.convert %j_iv : (index) -> i3294 fir.store %1 to %j : !fir.ref<i32>95 }96 }97 return98}99 100// CHECK-LABEL: func.func @dc_2d_reduction(101// CHECK-SAME: %[[I_LB:[^[:space:]]+]]: index,102// CHECK-SAME: %[[I_UB:[^[:space:]]+]]: index,103// CHECK-SAME: %[[I_ST:[^[:space:]]+]]: index,104// CHECK-SAME: %[[J_LB:[^[:space:]]+]]: index,105// CHECK-SAME: %[[J_UB:[^[:space:]]+]]: index,106// CHECK-SAME: %[[J_ST:[^[:space:]]+]]: index) {107 108// CHECK: %[[I:.*]] = fir.alloca i32109// CHECK: %[[J:.*]] = fir.alloca i32110// CHECK: %[[SUM:.*]] = fir.alloca i32111 112// CHECK: fir.do_loop %[[I_IV:.*]] = %[[I_LB]] to %[[I_UB]] step %[[I_ST]] unordered reduce({{.*}}<add>] -> %[[SUM]] : !fir.ref<i32>) {113// CHECK: fir.do_loop %[[J_IV:.*]] = %[[J_LB]] to %[[J_UB]] step %[[J_ST]] unordered reduce({{.*}}<add>] -> %[[SUM]] : !fir.ref<i32>) {114// CHECK: %[[I_IV_CVT:.*]] = fir.convert %[[I_IV]] : (index) -> i32115// CHECK: fir.store %[[I_IV_CVT]] to %[[I]] : !fir.ref<i32>116// CHECK: %[[J_IV_CVT:.*]] = fir.convert %[[J_IV]] : (index) -> i32117// CHECK: fir.store %[[J_IV_CVT]] to %[[J]] : !fir.ref<i32>118// CHECK: fir.result119// CHECK: }120// CHECK: fir.result121// CHECK: }122// CHECK: return123// CHECK: }124 125// -----126 127fir.local {type = local} @local_localizer : i32128 129fir.local {type = local_init} @local_init_localizer : i32 copy {130^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<i32>):131 %0 = fir.load %arg0 : !fir.ref<i32>132 fir.store %0 to %arg1 : !fir.ref<i32>133 fir.yield(%arg1 : !fir.ref<i32>)134}135 136func.func @do_concurrent_locality_specs() {137 %3 = fir.alloca i32 {bindc_name = "local_init_var", uniq_name = "_QFdo_concurrentElocal_init_var"}138 %4:2 = hlfir.declare %3 {uniq_name = "_QFdo_concurrentElocal_init_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)139 %5 = fir.alloca i32 {bindc_name = "local_var", uniq_name = "_QFdo_concurrentElocal_var"}140 %6:2 = hlfir.declare %5 {uniq_name = "_QFdo_concurrentElocal_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)141 %c1 = arith.constant 1 : index142 %c10 = arith.constant 1 : index143 fir.do_concurrent {144 %9 = fir.alloca i32 {bindc_name = "i"}145 %10:2 = hlfir.declare %9 {uniq_name = "_QFdo_concurrentEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)146 fir.do_concurrent.loop (%arg0) = (%c1) to (%c10) step (%c1) local(@local_localizer %6#0 -> %arg1, @local_init_localizer %4#0 -> %arg2 : !fir.ref<i32>, !fir.ref<i32>) {147 %11 = fir.convert %arg0 : (index) -> i32148 fir.store %11 to %10#0 : !fir.ref<i32>149 %13:2 = hlfir.declare %arg1 {uniq_name = "_QFdo_concurrentElocal_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)150 %15:2 = hlfir.declare %arg2 {uniq_name = "_QFdo_concurrentElocal_init_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)151 %17 = fir.load %10#0 : !fir.ref<i32>152 %c5_i32 = arith.constant 5 : i32153 %18 = arith.cmpi slt, %17, %c5_i32 : i32154 fir.if %18 {155 %c42_i32 = arith.constant 42 : i32156 hlfir.assign %c42_i32 to %13#0 : i32, !fir.ref<i32>157 } else {158 %c84_i32 = arith.constant 84 : i32159 hlfir.assign %c84_i32 to %15#0 : i32, !fir.ref<i32>160 }161 }162 }163 return164}165 166// CHECK-LABEL: func.func @do_concurrent_locality_specs() {167// CHECK: %[[LOC_INIT_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "{{.*}}Elocal_init_var"}168// CHECK: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {169// Verify localization of the `local` var.170// CHECK: %[[PRIV_LOC_ALLOC:.*]] = fir.alloca i32171 172// Verify localization of the `local_init` var.173// CHECK: %[[PRIV_LOC_INIT_ALLOC:.*]] = fir.alloca i32174// CHECK: %[[LOC_INIT_VAL:.*]] = fir.load %[[LOC_INIT_DECL]]#0 : !fir.ref<i32>175// CHECK: fir.store %[[LOC_INIT_VAL]] to %[[PRIV_LOC_INIT_ALLOC]] : !fir.ref<i32>176 177// CHECK: %[[VAL_15:.*]]:2 = hlfir.declare %[[PRIV_LOC_ALLOC]]178// CHECK: %[[VAL_16:.*]]:2 = hlfir.declare %[[PRIV_LOC_INIT_ALLOC]]179 180// CHECK: hlfir.assign %{{.*}} to %[[VAL_15]]#0 : i32, !fir.ref<i32>181// CHECK: hlfir.assign %{{.*}} to %[[VAL_16]]#0 : i32, !fir.ref<i32>182// CHECK: }183// CHECK: return184// CHECK: }185