1 #include <cstdint> 2 3 #include "benchmark/benchmark.h" 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 } // namespace 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 25 private: BitRefBitRef26 BitRef(int i, unsigned char& b) : index(i), byte(b) {} 27 }; 28 main(int,char * [])29int main(int, char*[]) { 30 // this test verifies compilation of DoNotOptimize() for some types 31 32 char buffer8[8] = ""; 33 benchmark::DoNotOptimize(buffer8); 34 35 char buffer20[20] = ""; 36 benchmark::DoNotOptimize(buffer20); 37 38 char buffer1024[1024] = ""; 39 benchmark::DoNotOptimize(buffer1024); 40 benchmark::DoNotOptimize(&buffer1024[0]); 41 42 int x = 123; 43 benchmark::DoNotOptimize(x); 44 benchmark::DoNotOptimize(&x); 45 benchmark::DoNotOptimize(x += 42); 46 47 benchmark::DoNotOptimize(double_up(x)); 48 49 // These tests are to e 50 benchmark::DoNotOptimize(BitRef::Make()); 51 BitRef lval = BitRef::Make(); 52 benchmark::DoNotOptimize(lval); 53 } 54