xref: /netbsd-src/external/apache2/llvm/dist/libcxx/utils/google-benchmark/test/donotoptimize_test.cc (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg #include "benchmark/benchmark.h"
2*4d6fc14bSjoerg 
3*4d6fc14bSjoerg #include <cstdint>
4*4d6fc14bSjoerg 
5*4d6fc14bSjoerg namespace {
6*4d6fc14bSjoerg #if defined(__GNUC__)
7*4d6fc14bSjoerg std::uint64_t double_up(const std::uint64_t x) __attribute__((const));
8*4d6fc14bSjoerg #endif
double_up(const std::uint64_t x)9*4d6fc14bSjoerg std::uint64_t double_up(const std::uint64_t x) { return x * 2; }
10*4d6fc14bSjoerg }
11*4d6fc14bSjoerg 
12*4d6fc14bSjoerg // Using DoNotOptimize on types like BitRef seem to cause a lot of problems
13*4d6fc14bSjoerg // with the inline assembly on both GCC and Clang.
14*4d6fc14bSjoerg struct BitRef {
15*4d6fc14bSjoerg   int index;
16*4d6fc14bSjoerg   unsigned char &byte;
17*4d6fc14bSjoerg 
18*4d6fc14bSjoerg public:
MakeBitRef19*4d6fc14bSjoerg   static BitRef Make() {
20*4d6fc14bSjoerg     static unsigned char arr[2] = {};
21*4d6fc14bSjoerg     BitRef b(1, arr[0]);
22*4d6fc14bSjoerg     return b;
23*4d6fc14bSjoerg   }
24*4d6fc14bSjoerg private:
BitRefBitRef25*4d6fc14bSjoerg   BitRef(int i, unsigned char& b) : index(i), byte(b) {}
26*4d6fc14bSjoerg };
27*4d6fc14bSjoerg 
main(int,char * [])28*4d6fc14bSjoerg int main(int, char*[]) {
29*4d6fc14bSjoerg   // this test verifies compilation of DoNotOptimize() for some types
30*4d6fc14bSjoerg 
31*4d6fc14bSjoerg   char buffer8[8] = "";
32*4d6fc14bSjoerg   benchmark::DoNotOptimize(buffer8);
33*4d6fc14bSjoerg 
34*4d6fc14bSjoerg   char buffer20[20] = "";
35*4d6fc14bSjoerg   benchmark::DoNotOptimize(buffer20);
36*4d6fc14bSjoerg 
37*4d6fc14bSjoerg   char buffer1024[1024] = "";
38*4d6fc14bSjoerg   benchmark::DoNotOptimize(buffer1024);
39*4d6fc14bSjoerg   benchmark::DoNotOptimize(&buffer1024[0]);
40*4d6fc14bSjoerg 
41*4d6fc14bSjoerg   int x = 123;
42*4d6fc14bSjoerg   benchmark::DoNotOptimize(x);
43*4d6fc14bSjoerg   benchmark::DoNotOptimize(&x);
44*4d6fc14bSjoerg   benchmark::DoNotOptimize(x += 42);
45*4d6fc14bSjoerg 
46*4d6fc14bSjoerg   benchmark::DoNotOptimize(double_up(x));
47*4d6fc14bSjoerg 
48*4d6fc14bSjoerg   // These tests are to e
49*4d6fc14bSjoerg   benchmark::DoNotOptimize(BitRef::Make());
50*4d6fc14bSjoerg   BitRef lval = BitRef::Make();
51*4d6fc14bSjoerg   benchmark::DoNotOptimize(lval);
52*4d6fc14bSjoerg }
53