[Openmp-commits] [openmp] 518b08c - [OpenMP] Fix issue of indirect function call in `__kmpc_fork_call_if` (#65436)
via Openmp-commits
openmp-commits at lists.llvm.org
Wed Sep 6 09:17:50 PDT 2023
Author: Shilei Tian
Date: 2023-09-06T12:17:45-04:00
New Revision: 518b08c193cc356f4c85b6402b9352279d37db3a
URL: https://github.com/llvm/llvm-project/commit/518b08c193cc356f4c85b6402b9352279d37db3a
DIFF: https://github.com/llvm/llvm-project/commit/518b08c193cc356f4c85b6402b9352279d37db3a.diff
LOG: [OpenMP] Fix issue of indirect function call in `__kmpc_fork_call_if` (#65436)
The outlined function is typically invoked by using
`__kmp_invoke_microtask`,
which is written in asm. D138495 introduces a new interface function for
parallel
region for OpenMPIRBuilder, where the outlined function is called via
the function
pointer. For some reason, it works perfectly well on x86 and x86-64
system, but
doesn't work on Apple Silicon. The 3rd argument in the callee is always
`nullptr`, even
if it is not in caller. It appears `x2` always contains `0x0`. This
patch adopts
the typical method to invoke the function pointer. It works on my M2
Ultra Mac.
Fix #63194.
Added:
Modified:
openmp/runtime/src/kmp_csupport.cpp
Removed:
################################################################################
diff --git a/openmp/runtime/src/kmp_csupport.cpp b/openmp/runtime/src/kmp_csupport.cpp
index 8bd0e89a7dacd9..fb79adb936412c 100644
--- a/openmp/runtime/src/kmp_csupport.cpp
+++ b/openmp/runtime/src/kmp_csupport.cpp
@@ -343,7 +343,6 @@ Perform a fork only if the condition is true.
void __kmpc_fork_call_if(ident_t *loc, kmp_int32 argc, kmpc_micro microtask,
kmp_int32 cond, void *args) {
int gtid = __kmp_entry_gtid();
- int zero = 0;
if (cond) {
if (args)
__kmpc_fork_call(loc, argc, microtask, args);
@@ -352,10 +351,29 @@ void __kmpc_fork_call_if(ident_t *loc, kmp_int32 argc, kmpc_micro microtask,
} else {
__kmpc_serialized_parallel(loc, gtid);
+#ifdef OMPT_SUPPORT
+ void *exit_frame_ptr;
+#endif
+
if (args)
- microtask(>id, &zero, args);
+ __kmp_invoke_microtask(VOLATILE_CAST(microtask_t) microtask, gtid,
+ /*npr=*/0,
+ /*argc=*/1, &args
+#ifdef OMPT_SUPPORT
+ ,
+ &exit_frame_ptr
+#endif
+ );
else
- microtask(>id, &zero);
+ __kmp_invoke_microtask(VOLATILE_CAST(microtask_t) microtask, gtid,
+ /*npr=*/0,
+ /*argc=*/0,
+ /*args=*/nullptr
+#ifdef OMPT_SUPPORT
+ ,
+ &exit_frame_ptr
+#endif
+ );
__kmpc_end_serialized_parallel(loc, gtid);
}
More information about the Openmp-commits
mailing list