brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 899ce92 Raw
108 lines · cpp
1// RUN: %clangxx_tsan %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s3 4// bench.h needs pthread barriers which are not available on OS X5// UNSUPPORTED: darwin6 7#include "bench.h"8#include <memory.h>9 10void thread(int tid) {11  volatile long x = 0;12  switch (bench_mode) {13  case 0:14    for (int i = 0; i < bench_niter; i++)15      *(volatile char *)&x = 1;16    break;17  case 1:18    for (int i = 0; i < bench_niter; i++)19      *(volatile short *)&x = 1;20    break;21  case 2:22    for (int i = 0; i < bench_niter; i++)23      *(volatile int *)&x = 1;24    break;25  case 3:26    for (int i = 0; i < bench_niter; i++)27      *(volatile long *)&x = 1;28    break;29  case 4:30    for (int i = 0; i < bench_niter; i++)31      *(volatile char *)&x;32    break;33  case 5:34    for (int i = 0; i < bench_niter; i++)35      *(volatile short *)&x;36    break;37  case 6:38    for (int i = 0; i < bench_niter; i++)39      *(volatile int *)&x;40    break;41  case 7:42    for (int i = 0; i < bench_niter; i++)43      *(volatile long *)&x;44  case 8:45    for (int i = 0; i < bench_niter / 10; i++) {46      ((volatile long *)&x)[0];47      ((volatile int *)&x)[0];48      ((volatile short *)&x)[2];49      ((volatile char *)&x)[6];50      ((volatile char *)&x)[7];51      ((volatile long *)&x)[0] = 1;52      ((volatile int *)&x)[0] = 1;53      ((volatile short *)&x)[2] = 1;54      ((volatile char *)&x)[6] = 1;55      ((volatile char *)&x)[7] = 1;56    }57    break;58  case 9: {59    volatile long size = sizeof(x);60    for (int i = 0; i < bench_niter; i++)61      memset((void *)&x, i, size);62    break;63  }64  case 10: {65    volatile long data[2] = {};66    volatile long size = sizeof(data) - 2;67    for (int i = 0; i < bench_niter; i++)68      memset(((char *)data) + 1, i, size);69    break;70  }71  case 11: {72    volatile long data[2] = {};73    for (int i = 0; i < bench_niter / 8 / 3; i++) {74      for (int off = 0; off < 8; off++) {75        __sanitizer_unaligned_store16(((char *)data) + off, i);76        __sanitizer_unaligned_store32(((char *)data) + off, i);77        __sanitizer_unaligned_store64(((char *)data) + off, i);78      }79    }80    break;81  }82#if TSAN_VECTORIZE83  case 12: {84    // The compiler wants to optimize all this away.85    // Use volatile to prevent optimization, but then use kBlock86    // to avoid the additional non-vector load in the inner loop.87    // Also use only even indexes to prevent compiler from88    // inserting memset.89    const int kBlock = 128;90    __m128i data[kBlock * 2];91    __m128i *volatile vptr = data;92    for (int i = 0; i < bench_niter / kBlock; i++) {93      __m128i *ptr = vptr;94      for (int j = 0; j < kBlock; j++)95        _mm_store_si128(&ptr[j * 2], _mm_setzero_si128());96    }97    break;98  }99#endif100  }101}102 103void bench() {104  start_thread_group(bench_nthread, thread);105}106 107// CHECK: DONE108