Index: openmp/runtime/src/kmp.h =================================================================== --- openmp/runtime/src/kmp.h +++ openmp/runtime/src/kmp.h @@ -2154,6 +2154,7 @@ kmp_task_t *task; /* non-NULL if depnode is active, used under lock */ kmp_lock_t *mtx_locks[MAX_MTX_DEPS]; /* lock mutexinoutset dependent tasks */ kmp_int32 mtx_num_locks; /* number of locks in mtx_locks array */ + kmp_int32 on_stack; /* the node is allocated on stack */ kmp_lock_t lock; /* guards shared fields: task, successors */ #if KMP_SUPPORT_GRAPH_OUTPUT kmp_uint32 id; Index: openmp/runtime/src/kmp_taskdeps.h =================================================================== --- openmp/runtime/src/kmp_taskdeps.h +++ openmp/runtime/src/kmp_taskdeps.h @@ -21,12 +21,13 @@ #define KMP_RELEASE_DEPNODE(gtid, n) __kmp_release_lock(&(n)->dn.lock, (gtid)) static inline void __kmp_node_deref(kmp_info_t *thread, kmp_depnode_t *node) { - if (!node) + if (!node /*|| node->dn.on_stack*/) return; kmp_int32 n = KMP_ATOMIC_DEC(&node->dn.nrefs) - 1; if (n == 0) { KMP_ASSERT(node->dn.nrefs == 0); + KMP_ASSERT(node->dn.on_stack != 0); #if USE_FAST_MEMORY __kmp_fast_free(thread, node); #else Index: openmp/runtime/src/kmp_taskdeps.cpp =================================================================== --- openmp/runtime/src/kmp_taskdeps.cpp +++ openmp/runtime/src/kmp_taskdeps.cpp @@ -35,6 +35,7 @@ static void __kmp_init_node(kmp_depnode_t *node) { node->dn.successors = NULL; + node->dn.on_stack = 0; node->dn.task = NULL; // will point to the right task // once dependences have been processed for (int i = 0; i < MAX_MTX_DEPS; ++i) @@ -771,6 +772,7 @@ kmp_depnode_t node = {0}; __kmp_init_node(&node); + node.dn.on_stack = 1; if (!__kmp_check_deps(gtid, &node, NULL, ¤t_task->td_dephash, DEP_BARRIER, ndeps, dep_list, ndeps_noalias,