tsan_bench.cc revision 603c4be006d8c53905d736bf1f19a49f5ce98276
1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_bench.cc -----------------------------------------------------===// 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// The LLVM Compiler Infrastructure 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details. 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_test_util.h" 14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_interface.h" 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_defs.h" 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h" 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stdint.h> 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyconst int kSize = 128; 20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyconst int kRepeat = 2*1024*1024; 21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid noinstr(void *p) {} 23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanytemplate<typename T, void(*__tsan_mop)(void *p)> 25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void Benchmark() { 26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany volatile T data[kSize]; 27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < kRepeat; i++) { 28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int j = 0; j < kSize; j++) { 29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany __tsan_mop((void*)&data[j]); 30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany data[j]++; 31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop1) { 36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint8_t, noinstr>(); 37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop1Read) { 40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint8_t, __tsan_read1>(); 41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop1Write) { 44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint8_t, __tsan_write1>(); 45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop2) { 48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint16_t, noinstr>(); 49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop2Read) { 52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint16_t, __tsan_read2>(); 53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop2Write) { 56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint16_t, __tsan_write2>(); 57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop4) { 60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint32_t, noinstr>(); 61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop4Read) { 64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint32_t, __tsan_read4>(); 65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop4Write) { 68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint32_t, __tsan_write4>(); 69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop8) { 72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint8_t, noinstr>(); 73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop8Read) { 76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint64_t, __tsan_read8>(); 77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 79da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, Mop8Write) { 80da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Benchmark<uint64_t, __tsan_write8>(); 81da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 82da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 83da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, FuncCall) { 84da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < kRepeat; i++) { 85da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int j = 0; j < kSize; j++) 86da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany __tsan_func_entry((void*)(uintptr_t)j); 87da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int j = 0; j < kSize; j++) 88da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany __tsan_func_exit(); 89da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 90da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 91da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 92da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(DISABLED_BENCH, MutexLocal) { 93da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Mutex m; 94da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread().Create(m); 95da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < 50; i++) { 96da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread t; 97da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t.Lock(m); 98da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany t.Unlock(m); 99da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 100da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (int i = 0; i < 16*1024*1024; i++) { 101da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany m.Lock(); 102da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany m.Unlock(); 103da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany } 104da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany ScopedThread().Destroy(m); 105da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 106