1*dbb99499SAndroid Build Coastguard Worker #include <cstdint> 2*dbb99499SAndroid Build Coastguard Worker 3*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h" 4*dbb99499SAndroid Build Coastguard Worker 5*dbb99499SAndroid Build Coastguard Worker namespace { 6*dbb99499SAndroid Build Coastguard Worker #if defined(__GNUC__) 7*dbb99499SAndroid Build Coastguard Worker std::int64_t double_up(const std::int64_t x) __attribute__((const)); 8*dbb99499SAndroid Build Coastguard Worker #endif double_up(const std::int64_t x)9*dbb99499SAndroid Build Coastguard Workerstd::int64_t double_up(const std::int64_t x) { return x * 2; } 10*dbb99499SAndroid Build Coastguard Worker } // namespace 11*dbb99499SAndroid Build Coastguard Worker 12*dbb99499SAndroid Build Coastguard Worker // Using DoNotOptimize on types like BitRef seem to cause a lot of problems 13*dbb99499SAndroid Build Coastguard Worker // with the inline assembly on both GCC and Clang. 14*dbb99499SAndroid Build Coastguard Worker struct BitRef { 15*dbb99499SAndroid Build Coastguard Worker int index; 16*dbb99499SAndroid Build Coastguard Worker unsigned char& byte; 17*dbb99499SAndroid Build Coastguard Worker 18*dbb99499SAndroid Build Coastguard Worker public: MakeBitRef19*dbb99499SAndroid Build Coastguard Worker static BitRef Make() { 20*dbb99499SAndroid Build Coastguard Worker static unsigned char arr[2] = {}; 21*dbb99499SAndroid Build Coastguard Worker BitRef b(1, arr[0]); 22*dbb99499SAndroid Build Coastguard Worker return b; 23*dbb99499SAndroid Build Coastguard Worker } 24*dbb99499SAndroid Build Coastguard Worker 25*dbb99499SAndroid Build Coastguard Worker private: BitRefBitRef26*dbb99499SAndroid Build Coastguard Worker BitRef(int i, unsigned char& b) : index(i), byte(b) {} 27*dbb99499SAndroid Build Coastguard Worker }; 28*dbb99499SAndroid Build Coastguard Worker main(int,char * [])29*dbb99499SAndroid Build Coastguard Workerint main(int, char*[]) { 30*dbb99499SAndroid Build Coastguard Worker // this test verifies compilation of DoNotOptimize() for some types 31*dbb99499SAndroid Build Coastguard Worker 32*dbb99499SAndroid Build Coastguard Worker char buffer1[1] = ""; 33*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer1); 34*dbb99499SAndroid Build Coastguard Worker 35*dbb99499SAndroid Build Coastguard Worker char buffer2[2] = ""; 36*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer2); 37*dbb99499SAndroid Build Coastguard Worker 38*dbb99499SAndroid Build Coastguard Worker char buffer3[3] = ""; 39*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer3); 40*dbb99499SAndroid Build Coastguard Worker 41*dbb99499SAndroid Build Coastguard Worker char buffer8[8] = ""; 42*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer8); 43*dbb99499SAndroid Build Coastguard Worker 44*dbb99499SAndroid Build Coastguard Worker char buffer20[20] = ""; 45*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer20); 46*dbb99499SAndroid Build Coastguard Worker 47*dbb99499SAndroid Build Coastguard Worker char buffer1024[1024] = ""; 48*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(buffer1024); 49*dbb99499SAndroid Build Coastguard Worker char* bptr = &buffer1024[0]; 50*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(bptr); 51*dbb99499SAndroid Build Coastguard Worker 52*dbb99499SAndroid Build Coastguard Worker int x = 123; 53*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x); 54*dbb99499SAndroid Build Coastguard Worker int* xp = &x; 55*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(xp); 56*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x += 42); 57*dbb99499SAndroid Build Coastguard Worker 58*dbb99499SAndroid Build Coastguard Worker std::int64_t y = double_up(x); 59*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(y); 60*dbb99499SAndroid Build Coastguard Worker 61*dbb99499SAndroid Build Coastguard Worker // These tests are to e 62*dbb99499SAndroid Build Coastguard Worker BitRef lval = BitRef::Make(); 63*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(lval); 64*dbb99499SAndroid Build Coastguard Worker 65*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11 66*dbb99499SAndroid Build Coastguard Worker // Check that accept rvalue. 67*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(BitRef::Make()); 68*dbb99499SAndroid Build Coastguard Worker #endif 69*dbb99499SAndroid Build Coastguard Worker } 70