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