[llvm-branch-commits] [OpenMP] Add taskgraph template interaction codegen tests (PR #200409)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri May 29 06:56:17 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Julian Brown (jtb20)
<details>
<summary>Changes</summary>
Add two Clang codegen tests for the OpenMP 6.0 taskgraph
directive exercising its interaction with templates -- in
particular checking that different instantiations of the same
template get distinct taskgraph handles.
Assisted-By: Claude Opus 4.7
---
Full diff: https://github.com/llvm/llvm-project/pull/200409.diff
2 Files Affected:
- (added) clang/test/OpenMP/taskgraph_template_handle_codegen.cpp (+36)
- (added) clang/test/OpenMP/taskgraph_templates_codegen.cpp (+73)
``````````diff
diff --git a/clang/test/OpenMP/taskgraph_template_handle_codegen.cpp b/clang/test/OpenMP/taskgraph_template_handle_codegen.cpp
new file mode 100644
index 0000000000000..0874fe58edb03
--- /dev/null
+++ b/clang/test/OpenMP/taskgraph_template_handle_codegen.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
+// expected-no-diagnostics
+
+#ifndef HEADER
+#define HEADER
+
+template <typename T>
+void templ_handle(T &x) {
+#pragma omp taskgraph
+ {
+#pragma omp task shared(x)
+ {
+ x += 1;
+ }
+ }
+}
+
+int main() {
+ int i = 0;
+ long l = 0;
+ templ_handle(i);
+ templ_handle(l);
+ return 0;
+}
+
+// CHECK-DAG: @[[H1:.omp.taskgraph.handle[^ ]*]] = internal global ptr null
+// CHECK-DAG: @[[H2:.omp.taskgraph.handle[^ ]*]] = internal global ptr null
+
+// CHECK-LABEL: define linkonce_odr {{.*}} @_Z12templ_handleIiEvRT_(
+// CHECK: call void @__kmpc_taskgraph(ptr {{[^,]+}}, i32 {{[^,]+}}, ptr @[[H1]], i64 0, i32 0, i32 0, ptr {{[^,]+}}, ptr {{[^)]+}})
+
+// CHECK-LABEL: define linkonce_odr {{.*}} @_Z12templ_handleIlEvRT_(
+// CHECK-NOT: ptr @[[H1]]
+// CHECK: call void @__kmpc_taskgraph(ptr {{[^,]+}}, i32 {{[^,]+}}, ptr @[[H2]], i64 0, i32 0, i32 0, ptr {{[^,]+}}, ptr {{[^)]+}})
+
+#endif
diff --git a/clang/test/OpenMP/taskgraph_templates_codegen.cpp b/clang/test/OpenMP/taskgraph_templates_codegen.cpp
new file mode 100644
index 0000000000000..16765bb078f4e
--- /dev/null
+++ b/clang/test/OpenMP/taskgraph_templates_codegen.cpp
@@ -0,0 +1,73 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
+// expected-no-diagnostics
+
+#ifndef HEADER
+#define HEADER
+
+// Exercises taskgraph codegen with orthogonal language/runtime features:
+// - C++ templates + non-trivial firstprivate cloning.
+// - taskgroup task_reduction / task in_reduction inside taskgraph.
+// - taskwait depend(...) inside taskgraph (task-generating path).
+
+template <typename T>
+struct Box {
+ T v;
+ Box();
+ Box(const Box &);
+ ~Box();
+};
+
+template <typename T>
+void templated_clone(T seed) {
+ Box<T> B;
+ B.v = seed;
+#pragma omp taskgraph
+ {
+#pragma omp task firstprivate(B)
+ {
+ (void)B.v;
+ }
+
+#pragma omp task replayable(false) firstprivate(B)
+ {
+ (void)B.v;
+ }
+ }
+}
+
+template <typename T>
+T templated_task_reduction(T seed) {
+ T Acc = seed;
+#pragma omp taskgraph
+ {
+#pragma omp taskgroup task_reduction(+: Acc)
+ {
+#pragma omp task in_reduction(+: Acc)
+ {
+ Acc += seed;
+ }
+ }
+#pragma omp taskwait depend(in: Acc)
+ }
+ return Acc;
+}
+
+int main() {
+ templated_clone<int>(7);
+ return templated_task_reduction<int>(1);
+}
+
+// The taskgraph task entry uses the taskgraph runtime path and carries a
+// clone helper for non-trivial firstprivate copies.
+// CHECK: call i32 @__kmpc_taskgraph_task(
+// CHECK-SAME: ptr @.omp_task_clone.)
+// CHECK: define internal void @.omp_task_clone.(
+
+// task_reduction in a taskgraph uses the dedicated taskgraph reduction init.
+// CHECK: call ptr @__kmpc_taskgraph_taskred_init(
+
+// taskwait depend(...) inside taskgraph uses the dedicated taskgraph taskwait
+// entry point instead of the generic taskwait runtime path.
+// CHECK: call void @__kmpc_taskgraph_taskwait(
+
+#endif
``````````
</details>
https://github.com/llvm/llvm-project/pull/200409
More information about the llvm-branch-commits
mailing list