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