Index: openmp/trunk/runtime/src/kmp_csupport.cpp =================================================================== --- openmp/trunk/runtime/src/kmp_csupport.cpp +++ openmp/trunk/runtime/src/kmp_csupport.cpp @@ -3802,23 +3802,30 @@ __kmp_wait_yield_4((volatile kmp_uint32 *)&sh_buf->doacross_buf_idx, idx, __kmp_eq_4, NULL); } +#if KMP_32_BIT_ARCH // Check if we are the first thread. After the CAS the first thread gets 0, // others get 1 if initialization is in progress, allocated pointer otherwise. + // Treat pointer as volatile integer (value 0 or 1) until memory is allocated. + flags = (kmp_uint32 *)KMP_COMPARE_AND_STORE_RET32( + (volatile kmp_int32 *)&sh_buf->doacross_flags, NULL, 1); +#else flags = (kmp_uint32 *)KMP_COMPARE_AND_STORE_RET64( - (kmp_int64 *)&sh_buf->doacross_flags, NULL, (kmp_int64)1); + (volatile kmp_int64 *)&sh_buf->doacross_flags, NULL, 1LL); +#endif if (flags == NULL) { // we are the first thread, allocate the array of flags - kmp_int64 size = - trace_count / 8 + 8; // in bytes, use single bit per iteration + size_t size = trace_count / 8 + 8; // in bytes, use single bit per iteration sh_buf->doacross_flags = (kmp_uint32 *)__kmp_thread_calloc(th, size, 1); - } else if ((kmp_int64)flags == 1) { + } else if (flags == (kmp_uint32 *)1) { +#if KMP_32_BIT_ARCH // initialization is still in progress, need to wait - while ((volatile kmp_int64)sh_buf->doacross_flags == 1) { + while (*(volatile kmp_int32 *)&sh_buf->doacross_flags == 1) +#else + while (*(volatile kmp_int64 *)&sh_buf->doacross_flags == 1LL) +#endif KMP_YIELD(TRUE); - } } - KMP_DEBUG_ASSERT((kmp_int64)sh_buf->doacross_flags > - 1); // check value of pointer + KMP_DEBUG_ASSERT(sh_buf->doacross_flags > (kmp_uint32 *)1); // check ptr value pr_buf->th_doacross_flags = sh_buf->doacross_flags; // save private copy in order to not // touch shared buffer on each iteration