xref: /openbsd-src/gnu/llvm/compiler-rt/lib/tsan/tests/rtl/tsan_bench.cpp (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===-- tsan_bench.cpp ----------------------------------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #include "tsan_test_util.h"
133cab2bb3Spatrick #include "tsan_interface.h"
143cab2bb3Spatrick #include "tsan_defs.h"
153cab2bb3Spatrick #include "gtest/gtest.h"
163cab2bb3Spatrick #include <stdint.h>
173cab2bb3Spatrick 
183cab2bb3Spatrick const int kSize = 128;
193cab2bb3Spatrick const int kRepeat = 2*1024*1024;
203cab2bb3Spatrick 
noinstr(void * p)213cab2bb3Spatrick void noinstr(void *p) {}
223cab2bb3Spatrick 
233cab2bb3Spatrick template<typename T, void(*__tsan_mop)(void *p)>
Benchmark()243cab2bb3Spatrick static void Benchmark() {
253cab2bb3Spatrick   volatile T data[kSize];
263cab2bb3Spatrick   for (int i = 0; i < kRepeat; i++) {
273cab2bb3Spatrick     for (int j = 0; j < kSize; j++) {
283cab2bb3Spatrick       __tsan_mop((void*)&data[j]);
293cab2bb3Spatrick       data[j]++;
303cab2bb3Spatrick     }
313cab2bb3Spatrick   }
323cab2bb3Spatrick }
333cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop1)343cab2bb3Spatrick TEST(DISABLED_BENCH, Mop1) {
353cab2bb3Spatrick   Benchmark<uint8_t, noinstr>();
363cab2bb3Spatrick }
373cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop1Read)383cab2bb3Spatrick TEST(DISABLED_BENCH, Mop1Read) {
393cab2bb3Spatrick   Benchmark<uint8_t, __tsan_read1>();
403cab2bb3Spatrick }
413cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop1Write)423cab2bb3Spatrick TEST(DISABLED_BENCH, Mop1Write) {
433cab2bb3Spatrick   Benchmark<uint8_t, __tsan_write1>();
443cab2bb3Spatrick }
453cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop2)463cab2bb3Spatrick TEST(DISABLED_BENCH, Mop2) {
473cab2bb3Spatrick   Benchmark<uint16_t, noinstr>();
483cab2bb3Spatrick }
493cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop2Read)503cab2bb3Spatrick TEST(DISABLED_BENCH, Mop2Read) {
513cab2bb3Spatrick   Benchmark<uint16_t, __tsan_read2>();
523cab2bb3Spatrick }
533cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop2Write)543cab2bb3Spatrick TEST(DISABLED_BENCH, Mop2Write) {
553cab2bb3Spatrick   Benchmark<uint16_t, __tsan_write2>();
563cab2bb3Spatrick }
573cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop4)583cab2bb3Spatrick TEST(DISABLED_BENCH, Mop4) {
593cab2bb3Spatrick   Benchmark<uint32_t, noinstr>();
603cab2bb3Spatrick }
613cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop4Read)623cab2bb3Spatrick TEST(DISABLED_BENCH, Mop4Read) {
633cab2bb3Spatrick   Benchmark<uint32_t, __tsan_read4>();
643cab2bb3Spatrick }
653cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop4Write)663cab2bb3Spatrick TEST(DISABLED_BENCH, Mop4Write) {
673cab2bb3Spatrick   Benchmark<uint32_t, __tsan_write4>();
683cab2bb3Spatrick }
693cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop8)703cab2bb3Spatrick TEST(DISABLED_BENCH, Mop8) {
713cab2bb3Spatrick   Benchmark<uint8_t, noinstr>();
723cab2bb3Spatrick }
733cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop8Read)743cab2bb3Spatrick TEST(DISABLED_BENCH, Mop8Read) {
753cab2bb3Spatrick   Benchmark<uint64_t, __tsan_read8>();
763cab2bb3Spatrick }
773cab2bb3Spatrick 
TEST(DISABLED_BENCH,Mop8Write)783cab2bb3Spatrick TEST(DISABLED_BENCH, Mop8Write) {
793cab2bb3Spatrick   Benchmark<uint64_t, __tsan_write8>();
803cab2bb3Spatrick }
813cab2bb3Spatrick 
TEST(DISABLED_BENCH,FuncCall)823cab2bb3Spatrick TEST(DISABLED_BENCH, FuncCall) {
833cab2bb3Spatrick   for (int i = 0; i < kRepeat; i++) {
843cab2bb3Spatrick     for (int j = 0; j < kSize; j++)
853cab2bb3Spatrick       __tsan_func_entry((void*)(uintptr_t)j);
863cab2bb3Spatrick     for (int j = 0; j < kSize; j++)
873cab2bb3Spatrick       __tsan_func_exit();
883cab2bb3Spatrick   }
893cab2bb3Spatrick }
903cab2bb3Spatrick 
TEST(DISABLED_BENCH,MutexLocal)913cab2bb3Spatrick TEST(DISABLED_BENCH, MutexLocal) {
92*d89ec533Spatrick   UserMutex m;
933cab2bb3Spatrick   ScopedThread().Create(m);
943cab2bb3Spatrick   for (int i = 0; i < 50; i++) {
953cab2bb3Spatrick     ScopedThread t;
963cab2bb3Spatrick     t.Lock(m);
973cab2bb3Spatrick     t.Unlock(m);
983cab2bb3Spatrick   }
993cab2bb3Spatrick   for (int i = 0; i < 16*1024*1024; i++) {
1003cab2bb3Spatrick     m.Lock();
1013cab2bb3Spatrick     m.Unlock();
1023cab2bb3Spatrick   }
1033cab2bb3Spatrick   ScopedThread().Destroy(m);
1043cab2bb3Spatrick }
105