[compiler-rt] d6a3c8c - Revert "tsan: add lock free stack pattern test"
Paul Kirth via llvm-commits
llvm-commits at lists.llvm.org
Fri May 20 17:19:02 PDT 2022
Author: Paul Kirth
Date: 2022-05-21T00:12:06Z
New Revision: d6a3c8ca1831879c60104db9efb39715b4206acc
URL: https://github.com/llvm/llvm-project/commit/d6a3c8ca1831879c60104db9efb39715b4206acc
DIFF: https://github.com/llvm/llvm-project/commit/d6a3c8ca1831879c60104db9efb39715b4206acc.diff
LOG: Revert "tsan: add lock free stack pattern test"
This reverts commit 5deca650fdba22a20e24b397e905ad0abba6f9a9.
Added:
Modified:
Removed:
compiler-rt/test/tsan/lock_free_stack.cpp
################################################################################
diff --git a/compiler-rt/test/tsan/lock_free_stack.cpp b/compiler-rt/test/tsan/lock_free_stack.cpp
deleted file mode 100755
index 5477adcfdf97..000000000000
--- a/compiler-rt/test/tsan/lock_free_stack.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
-// RUN: %clangxx_tsan -O1 %s -DRACE -o %t && %deflake %run %t | FileCheck %s --check-prefix=CHECK-RACE
-#include "test.h"
-
-const int kThreadCount = 4;
-#if RACE
-const int kTestCount = 16;
-#else
-const int kTestCount = 9;
-#endif
-
-template <typename F> F for_each_mo(int mo, F f) {
- f(mo);
- return f;
-}
-
-template <typename... Rest>
-auto for_each_mo(int mo, Rest... rest) -> decltype(for_each_mo(rest...)) {
- auto f = for_each_mo(rest...);
- f(mo);
- return f;
-}
-
-void LockFreeStackImpl(int test, bool main_thread, int mo2, int mo4) {
- struct Node {
- int data;
- Node *next;
- };
- static Node *heads[kTestCount]{};
- auto head = heads + test;
-
- auto concurrent_push = [head](Node *new_head, int mo1, int mo2, int mo3) {
- auto expected = __atomic_load_n(head, mo1);
- do {
- new_head->next = expected;
- } while (!__atomic_compare_exchange_n(head, &expected, new_head,
- /*weak*/ true, mo2, mo3));
- };
-
- auto concurrent_grab_all = [head](int mo4) {
- volatile int sink{};
- (void)sink;
-
- auto h = __atomic_exchange_n(head, nullptr, mo4);
- while (h) {
- sink = ++h->data;
- auto next = h->next;
- delete h;
- h = next;
- }
- };
-
- if (main_thread) {
- concurrent_grab_all(mo4);
- } else {
- int i = 0;
- // We have 15 combinations of mo1 and mo3. Since we have two race reports
- // for each combination (the first report is for 'data' and the second
- // report for 'next'), there are 30 race reports in total that should match
- // to "CHECK-RACE-COUNT{-number_of_reports}" below
- for_each_mo(
- __ATOMIC_RELAXED, __ATOMIC_ACQUIRE, __ATOMIC_SEQ_CST, [&](int mo1) {
- for_each_mo(__ATOMIC_RELAXED, __ATOMIC_ACQUIRE, __ATOMIC_RELEASE,
- __ATOMIC_ACQ_REL, __ATOMIC_SEQ_CST, [&](int mo3) {
- concurrent_push(new Node{i++}, mo1, mo2, mo3);
- });
- });
- }
-}
-
-void LockFreeStack(int test, bool main_thread, int mo2, int mo4) {
- barrier_wait(&barrier);
- if (main_thread) {
- // We need to call LockFreeStackImpl second time after the barrier
- // to guarantee at least one grab_all and cleanup.
- // However, it is better to have one instantiation of LockFreeStackImpl
- // on the main thread to merge the call stacks and prevent double race
- // reports. Therefore, we use two interation for loop and skip the barrier
- // on the second iteration.
- for (int i = 0; i < 2; ++i) {
- LockFreeStackImpl(test, main_thread, mo2, mo4);
- if (i == 0) {
- barrier_wait(&barrier);
- }
- }
- } else {
- LockFreeStackImpl(test, main_thread, mo2, mo4);
- barrier_wait(&barrier);
- }
-}
-
-void Test(bool main_thread) {
- for (int test = 0; test < kTestCount; test++) {
- if (main_thread) {
- fprintf(stderr, "Test %d\n", test);
- }
- switch (test) {
-#if RACE
- case 0:
- LockFreeStack(test, main_thread, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
- break;
- case 1:
- LockFreeStack(test, main_thread, __ATOMIC_RELAXED, __ATOMIC_ACQUIRE);
- break;
- case 2:
- LockFreeStack(test, main_thread, __ATOMIC_RELAXED, __ATOMIC_RELEASE);
- break;
- case 3:
- LockFreeStack(test, main_thread, __ATOMIC_RELAXED, __ATOMIC_ACQ_REL);
- break;
- case 4:
- LockFreeStack(test, main_thread, __ATOMIC_RELAXED, __ATOMIC_SEQ_CST);
- break;
- case 5:
- LockFreeStack(test, main_thread, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
- break;
- case 6:
- LockFreeStack(test, main_thread, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
- break;
- case 7:
- LockFreeStack(test, main_thread, __ATOMIC_ACQUIRE, __ATOMIC_RELEASE);
- break;
- case 8:
- LockFreeStack(test, main_thread, __ATOMIC_ACQUIRE, __ATOMIC_ACQ_REL);
- break;
- case 9:
- LockFreeStack(test, main_thread, __ATOMIC_ACQUIRE, __ATOMIC_SEQ_CST);
- break;
- case 10:
- LockFreeStack(test, main_thread, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
- break;
- case 11:
- LockFreeStack(test, main_thread, __ATOMIC_RELEASE, __ATOMIC_RELEASE);
- break;
- case 12:
- LockFreeStack(test, main_thread, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
- break;
- case 13:
- LockFreeStack(test, main_thread, __ATOMIC_ACQ_REL, __ATOMIC_RELEASE);
- break;
- case 14:
- LockFreeStack(test, main_thread, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
- break;
- case 15:
- LockFreeStack(test, main_thread, __ATOMIC_SEQ_CST, __ATOMIC_RELEASE);
- break;
-#else
- case 0:
- LockFreeStack(test, main_thread, __ATOMIC_RELEASE, __ATOMIC_ACQUIRE);
- break;
- case 1:
- LockFreeStack(test, main_thread, __ATOMIC_RELEASE, __ATOMIC_ACQ_REL);
- break;
- case 2:
- LockFreeStack(test, main_thread, __ATOMIC_RELEASE, __ATOMIC_SEQ_CST);
- break;
- case 3:
- LockFreeStack(test, main_thread, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE);
- break;
- case 4:
- LockFreeStack(test, main_thread, __ATOMIC_ACQ_REL, __ATOMIC_ACQ_REL);
- break;
- case 5:
- LockFreeStack(test, main_thread, __ATOMIC_ACQ_REL, __ATOMIC_SEQ_CST);
- break;
- case 6:
- LockFreeStack(test, main_thread, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
- break;
- case 7:
- LockFreeStack(test, main_thread, __ATOMIC_SEQ_CST, __ATOMIC_ACQ_REL);
- break;
- case 8:
- LockFreeStack(test, main_thread, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
- break;
-#endif
- }
- }
-}
-
-void *Thread(void *p) {
- Test(false);
- return 0;
-}
-
-int main() {
- barrier_init(&barrier, kThreadCount);
- pthread_t t[kThreadCount - 1];
- for (int i = 0; i < kThreadCount - 1; ++i)
- pthread_create(t + i, 0, Thread, (void *)(uintptr_t)(i + 1));
- Test(true);
- for (int i = 0; i < kThreadCount - 1; ++i)
- pthread_join(t[i], 0);
-}
-
-// No race tests
-// CHECK-NOT: ThreadSanitizer: data race
-
-// Race tests
-// 30 is the number of race reports for 15 possible combinations of mo1 and mo3
-// CHECK-RACE: Test 0
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 1
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 2
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 3
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 4
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 5
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 6
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 7
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 8
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 9
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 10
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 11
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 12
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 13
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 14
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE: Test 15
-// CHECK-RACE-COUNT-30: SUMMARY: ThreadSanitizer: data race
-// CHECK-RACE-NOT: SUMMARY: ThreadSanitizer: data race
More information about the llvm-commits
mailing list