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