| // RUN: mlir-translate --mlir-to-llvmir -split-input-file %s | FileCheck %s | |
| llvm.func @taskwait_depend(%x: !llvm.ptr) { | |
| omp.taskwait depend(taskdependout -> %x : !llvm.ptr) | |
| llvm.return | |
| } | |
| // CHECK-LABEL: define void @taskwait_depend | |
| // CHECK-SAME: (ptr[[xaddr:.+]]) | |
| // CHECK: %[[dep_arr_addr:.+]] = alloca [1 x %struct.kmp_dep_info], align 8 | |
| // CHECK: %[[omp_global_thread_num:.+]] = call i32 @__kmpc_global_thread_num({{.+}}) | |
| // CHECK: call void @__kmpc_omp_taskwait_deps_51(ptr @{{.+}}, i32 %[[omp_global_thread_num]], i32 1, ptr %[[dep_arr_addr]], i32 0, ptr null, i32 0) | |
| llvm.func @taskwait_depend_iterator(%x: !llvm.ptr) { | |
| %c1 = llvm.mlir.constant(1 : i64) : i64 | |
| %c10 = llvm.mlir.constant(10 : i64) : i64 | |
| %step = llvm.mlir.constant(1 : i64) : i64 | |
| %ix = omp.iterator(%i: i64) = (%c1 to %c10 step %step) { | |
| omp.yield(%x : !llvm.ptr) | |
| } -> !omp.iterated<!llvm.ptr> | |
| omp.taskwait depend(taskdependin -> %ix : !omp.iterated<!llvm.ptr>) | |
| llvm.return | |
| } | |
| // CHECK-LABEL: define void @taskwait_depend_iterator | |
| // CHECK-SAME: (ptr[[xaddr:.+]]) | |
| // CHECK: %[[dep_arr_addr:.+]] = tail call ptr @malloc(i64 200) | |
| // | |
| // CHECK: omp_dep_iterator.header: | |
| // CHECK: %[[iv:.*]] = phi i64 [ 0, %omp_dep_iterator.preheader ], [ %[[next:.*]], %omp_dep_iterator.inc ] | |
| // | |
| // CHECK: omp_dep_iterator.cond: | |
| // CHECK: %[[cmp:.*]] = icmp ult i64 %[[iv]], 10 | |
| // CHECK: br i1 %[[cmp]], label %omp_dep_iterator.body, label %omp_dep_iterator.exit | |
| // | |
| // CHECK: omp_dep_iterator.body: | |
| // CHECK: %[[idx:.*]] = add i64 0, %[[iv]] | |
| // CHECK: %[[entry:.*]] = getelementptr inbounds %struct.kmp_dep_info, ptr %[[dep_arr_addr]], i64 %[[idx]] | |
| // CHECK: %[[base_gep:.*]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[entry]], i32 0, i32 0 | |
| // CHECK: %[[ptrint:.*]] = ptrtoint ptr[[xaddr]] to i64 | |
| // CHECK: store i64 %[[ptrint]], ptr %[[base_gep]] | |
| // CHECK: %[[len_gep:.*]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[entry]], i32 0, i32 1 | |
| // CHECK: store i64 8, ptr %[[len_gep]] | |
| // CHECK: %[[flags_gep:.*]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[entry]], i32 0, i32 2 | |
| // CHECK: store i8 1, ptr %[[flags_gep]] | |
| // | |
| // CHECK: omp_dep_iterator.inc: | |
| // CHECK: %[[next]] = add nuw i64 %[[iv]], 1 | |
| // | |
| // CHECK: %[[omp_global_thread_num:.+]] = call i32 @__kmpc_global_thread_num({{.+}}) | |
| // CHECK: call void @__kmpc_omp_taskwait_deps_51(ptr @{{.+}}, i32 %[[omp_global_thread_num]], i32 10, ptr %[[dep_arr_addr]], i32 0, ptr null, i32 0) | |
| // CHECK: tail call void @free(ptr %[[dep_arr_addr:.+]]) |