[llvm-readobj] - Implement LLVM-style dumping for .stack_sizes sections.
[llvm-complete.git] / utils / benchmark / test / donotoptimize_test.cc
blob2ce92d1c72beda40a2275e4fe465375a9ae2e64d
1 #include "benchmark/benchmark.h"
3 #include <cstdint>
5 namespace {
6 #if defined(__GNUC__)
7 std::uint64_t double_up(const std::uint64_t x) __attribute__((const));
8 #endif
9 std::uint64_t double_up(const std::uint64_t x) { return x * 2; }
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;
18 public:
19 static BitRef Make() {
20 static unsigned char arr[2] = {};
21 BitRef b(1, arr[0]);
22 return b;
24 private:
25 BitRef(int i, unsigned char& b) : index(i), byte(b) {}
28 int main(int, char*[]) {
29 // this test verifies compilation of DoNotOptimize() for some types
31 char buffer8[8] = "";
32 benchmark::DoNotOptimize(buffer8);
34 char buffer20[20] = "";
35 benchmark::DoNotOptimize(buffer20);
37 char buffer1024[1024] = "";
38 benchmark::DoNotOptimize(buffer1024);
39 benchmark::DoNotOptimize(&buffer1024[0]);
41 int x = 123;
42 benchmark::DoNotOptimize(x);
43 benchmark::DoNotOptimize(&x);
44 benchmark::DoNotOptimize(x += 42);
46 benchmark::DoNotOptimize(double_up(x));
48 // These tests are to e
49 benchmark::DoNotOptimize(BitRef::Make());
50 BitRef lval = BitRef::Make();
51 benchmark::DoNotOptimize(lval);