95 lines · plain
1// Test code-gen for `omp.distribute` ops with delayed privatizers (i.e. using2// `omp.private` ops).3 4// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s5 6omp.private {type = private} @_QFEi_private_i32 : i327omp.private {type = private} @_QFEpriv_val_dist_private_f32 : f328 9llvm.func @_QQmain() {10 %0 = llvm.mlir.constant(1 : i64) : i6411 %1 = llvm.alloca %0 x f32 {bindc_name = "priv_val_dist"} : (i64) -> !llvm.ptr12 %3 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr13 %4 = llvm.mlir.constant(3.140000e+00 : f32) : f3214 %5 = llvm.mlir.constant(1000 : i32) : i3215 %6 = llvm.mlir.constant(1 : i32) : i3216 17 omp.teams {18 omp.distribute private(@_QFEpriv_val_dist_private_f32 %1 -> %arg0, @_QFEi_private_i32 %3 -> %arg1 : !llvm.ptr, !llvm.ptr) {19 omp.loop_nest (%arg2) : i32 = (%6) to (%5) inclusive step (%6) {20 llvm.store %arg2, %arg1 : i32, !llvm.ptr21 llvm.store %4, %arg0 : f32, !llvm.ptr22 omp.yield23 }24 }25 omp.terminator26 }27 28 llvm.return29}30 31// CHECK-LABEL: define void @_QQmain() {32// CHECK: call void {{.*}} @__kmpc_fork_teams(ptr @{{.*}}, i32 0, ptr @[[TEAMS_FUNC:.*]])33// CHECK-NEXT: br label %teams.exit34// CHECK: }35 36// CHECK: define internal void @[[TEAMS_FUNC]]({{.*}}) {37// CHECK: %[[PRIV_VAR_ALLOC:.*]] = alloca float, align 438// CHECK: %[[IV_ALLOC:.*]] = alloca i32, align 439 40// CHECK: omp.loop_nest.region:41// CHECK-NEXT: store i32 %{{.*}}, ptr %[[IV_ALLOC]], align 442// CHECK-NEXT: store float 0x40091EB860000000, ptr %[[PRIV_VAR_ALLOC]], align 443// CHECK: }44 45// -----46 47llvm.func @foo_free(!llvm.ptr)48 49omp.private {type = firstprivate} @_QFEpriv_val_dist_firstprivate_f32 : f32 copy {50^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):51 %0 = llvm.load %arg0 : !llvm.ptr -> f3252 llvm.store %0, %arg1 : f32, !llvm.ptr53 omp.yield(%arg1 : !llvm.ptr)54} dealloc {55 ^bb0(%arg0: !llvm.ptr):56 llvm.call @foo_free(%arg0) : (!llvm.ptr) -> ()57 omp.yield58}59 60llvm.func @_QQmain() {61 %0 = llvm.mlir.constant(1 : i64) : i6462 %1 = llvm.alloca %0 x f32 {bindc_name = "priv_val_dist"} : (i64) -> !llvm.ptr63 %4 = llvm.mlir.constant(3.140000e+00 : f32) : f3264 %6 = llvm.mlir.constant(1 : i32) : i3265 omp.distribute private(@_QFEpriv_val_dist_firstprivate_f32 %1 -> %arg0 : !llvm.ptr) {66 omp.loop_nest (%arg2) : i32 = (%6) to (%6) inclusive step (%6) {67 llvm.store %4, %arg0 : f32, !llvm.ptr68 omp.yield69 }70 }71 llvm.return72}73 74// CHECK-LABEL: define void @_QQmain() {75// CHECK: %[[SHARED_VAR_ALLOC:.*]] = alloca float, i64 1, align 476 77// CHECK: distribute.alloca:78// CHECK: %[[PRIV_VAR_ALLOC:.*]] = alloca float, align 479 80// CHECK: omp.private.copy:81// CHECK-NEXT: %[[SHARED_VAR_VAL:.*]] = load float, ptr %[[SHARED_VAR_ALLOC]], align 482// CHECK-NEXT: store float %[[SHARED_VAR_VAL]], ptr %[[PRIV_VAR_ALLOC]], align 483 84// CHECK: omp.loop_nest.region:85// CHECK-NEXT: store float 0x40091EB860000000, ptr %[[PRIV_VAR_ALLOC]], align 486 87// CHECK: omp_loop.after:88// CHECK-NEXT: br label %omp.region.cont89 90// CHECK: omp.region.cont:91// CHECK-NEXT: call void @foo_free(ptr %[[PRIV_VAR_ALLOC]])92// CHECK: }93 94 95