1*dbb99499SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
2*dbb99499SAndroid Build Coastguard Worker
3*dbb99499SAndroid Build Coastguard Worker #ifdef __clang__
4*dbb99499SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wreturn-type"
5*dbb99499SAndroid Build Coastguard Worker #endif
6*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DISABLE_DEPRECATED_WARNING
7*dbb99499SAndroid Build Coastguard Worker
8*dbb99499SAndroid Build Coastguard Worker extern "C" {
9*dbb99499SAndroid Build Coastguard Worker
10*dbb99499SAndroid Build Coastguard Worker extern int ExternInt;
11*dbb99499SAndroid Build Coastguard Worker extern int ExternInt2;
12*dbb99499SAndroid Build Coastguard Worker extern int ExternInt3;
13*dbb99499SAndroid Build Coastguard Worker extern int BigArray[2049];
14*dbb99499SAndroid Build Coastguard Worker
15*dbb99499SAndroid Build Coastguard Worker const int ConstBigArray[2049]{};
16*dbb99499SAndroid Build Coastguard Worker
17*dbb99499SAndroid Build Coastguard Worker inline int Add42(int x) { return x + 42; }
18*dbb99499SAndroid Build Coastguard Worker
19*dbb99499SAndroid Build Coastguard Worker struct NotTriviallyCopyable {
20*dbb99499SAndroid Build Coastguard Worker NotTriviallyCopyable();
21*dbb99499SAndroid Build Coastguard Worker explicit NotTriviallyCopyable(int x) : value(x) {}
22*dbb99499SAndroid Build Coastguard Worker NotTriviallyCopyable(NotTriviallyCopyable const &);
23*dbb99499SAndroid Build Coastguard Worker int value;
24*dbb99499SAndroid Build Coastguard Worker };
25*dbb99499SAndroid Build Coastguard Worker
26*dbb99499SAndroid Build Coastguard Worker struct Large {
27*dbb99499SAndroid Build Coastguard Worker int value;
28*dbb99499SAndroid Build Coastguard Worker int data[2];
29*dbb99499SAndroid Build Coastguard Worker };
30*dbb99499SAndroid Build Coastguard Worker
31*dbb99499SAndroid Build Coastguard Worker struct ExtraLarge {
32*dbb99499SAndroid Build Coastguard Worker int arr[2049];
33*dbb99499SAndroid Build Coastguard Worker };
34*dbb99499SAndroid Build Coastguard Worker }
35*dbb99499SAndroid Build Coastguard Worker
36*dbb99499SAndroid Build Coastguard Worker extern ExtraLarge ExtraLargeObj;
37*dbb99499SAndroid Build Coastguard Worker const ExtraLarge ConstExtraLargeObj{};
38*dbb99499SAndroid Build Coastguard Worker
39*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_rvalue:
test_with_rvalue()40*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_rvalue() {
41*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(Add42(0));
42*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, %eax
43*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
44*dbb99499SAndroid Build Coastguard Worker }
45*dbb99499SAndroid Build Coastguard Worker
46*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_large_rvalue:
test_with_large_rvalue()47*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_large_rvalue() {
48*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(Large{ExternInt, {ExternInt, ExternInt}});
49*dbb99499SAndroid Build Coastguard Worker // CHECK: ExternInt(%rip)
50*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG:[a-z]+]]
51*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
52*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
53*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
54*dbb99499SAndroid Build Coastguard Worker }
55*dbb99499SAndroid Build Coastguard Worker
56*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_non_trivial_rvalue:
test_with_non_trivial_rvalue()57*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_non_trivial_rvalue() {
58*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(NotTriviallyCopyable(ExternInt));
59*dbb99499SAndroid Build Coastguard Worker // CHECK: mov{{l|q}} ExternInt(%rip)
60*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
61*dbb99499SAndroid Build Coastguard Worker }
62*dbb99499SAndroid Build Coastguard Worker
63*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_lvalue:
test_with_lvalue()64*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_lvalue() {
65*dbb99499SAndroid Build Coastguard Worker int x = 101;
66*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x);
67*dbb99499SAndroid Build Coastguard Worker // CHECK-GNU: movl $101, %eax
68*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG: movl $101, -{{[0-9]+}}(%[[REG:[a-z]+]])
69*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
70*dbb99499SAndroid Build Coastguard Worker }
71*dbb99499SAndroid Build Coastguard Worker
72*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_large_lvalue:
test_with_large_lvalue()73*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_large_lvalue() {
74*dbb99499SAndroid Build Coastguard Worker Large L{ExternInt, {ExternInt, ExternInt}};
75*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(L);
76*dbb99499SAndroid Build Coastguard Worker // CHECK: ExternInt(%rip)
77*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG:[a-z]+]])
78*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
79*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
80*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
81*dbb99499SAndroid Build Coastguard Worker }
82*dbb99499SAndroid Build Coastguard Worker
83*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_extra_large_lvalue_with_op:
test_with_extra_large_lvalue_with_op()84*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_extra_large_lvalue_with_op() {
85*dbb99499SAndroid Build Coastguard Worker ExtraLargeObj.arr[16] = 42;
86*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(ExtraLargeObj);
87*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, ExtraLargeObj+64(%rip)
88*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
89*dbb99499SAndroid Build Coastguard Worker }
90*dbb99499SAndroid Build Coastguard Worker
91*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_big_array_with_op
test_with_big_array_with_op()92*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_big_array_with_op() {
93*dbb99499SAndroid Build Coastguard Worker BigArray[16] = 42;
94*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(BigArray);
95*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, BigArray+64(%rip)
96*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
97*dbb99499SAndroid Build Coastguard Worker }
98*dbb99499SAndroid Build Coastguard Worker
99*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_non_trivial_lvalue:
test_with_non_trivial_lvalue()100*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_non_trivial_lvalue() {
101*dbb99499SAndroid Build Coastguard Worker NotTriviallyCopyable NTC(ExternInt);
102*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(NTC);
103*dbb99499SAndroid Build Coastguard Worker // CHECK: ExternInt(%rip)
104*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG:[a-z]+]])
105*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
106*dbb99499SAndroid Build Coastguard Worker }
107*dbb99499SAndroid Build Coastguard Worker
108*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_const_lvalue:
test_with_const_lvalue()109*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_const_lvalue() {
110*dbb99499SAndroid Build Coastguard Worker const int x = 123;
111*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x);
112*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $123, %eax
113*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
114*dbb99499SAndroid Build Coastguard Worker }
115*dbb99499SAndroid Build Coastguard Worker
116*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_large_const_lvalue:
test_with_large_const_lvalue()117*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_large_const_lvalue() {
118*dbb99499SAndroid Build Coastguard Worker const Large L{ExternInt, {ExternInt, ExternInt}};
119*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(L);
120*dbb99499SAndroid Build Coastguard Worker // CHECK: ExternInt(%rip)
121*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG:[a-z]+]])
122*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
123*dbb99499SAndroid Build Coastguard Worker // CHECK: movl %eax, -{{[0-9]+}}(%[[REG]])
124*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
125*dbb99499SAndroid Build Coastguard Worker }
126*dbb99499SAndroid Build Coastguard Worker
127*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_const_extra_large_obj:
test_with_const_extra_large_obj()128*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_const_extra_large_obj() {
129*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(ConstExtraLargeObj);
130*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
131*dbb99499SAndroid Build Coastguard Worker }
132*dbb99499SAndroid Build Coastguard Worker
133*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_const_big_array
test_with_const_big_array()134*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_const_big_array() {
135*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(ConstBigArray);
136*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
137*dbb99499SAndroid Build Coastguard Worker }
138*dbb99499SAndroid Build Coastguard Worker
139*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_with_non_trivial_const_lvalue:
test_with_non_trivial_const_lvalue()140*dbb99499SAndroid Build Coastguard Worker extern "C" void test_with_non_trivial_const_lvalue() {
141*dbb99499SAndroid Build Coastguard Worker const NotTriviallyCopyable Obj(ExternInt);
142*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(Obj);
143*dbb99499SAndroid Build Coastguard Worker // CHECK: mov{{q|l}} ExternInt(%rip)
144*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
145*dbb99499SAndroid Build Coastguard Worker }
146*dbb99499SAndroid Build Coastguard Worker
147*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_div_by_two:
test_div_by_two(int input)148*dbb99499SAndroid Build Coastguard Worker extern "C" int test_div_by_two(int input) {
149*dbb99499SAndroid Build Coastguard Worker int divisor = 2;
150*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(divisor);
151*dbb99499SAndroid Build Coastguard Worker return input / divisor;
152*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $2, [[DEST:.*]]
153*dbb99499SAndroid Build Coastguard Worker // CHECK: idivl [[DEST]]
154*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
155*dbb99499SAndroid Build Coastguard Worker }
156*dbb99499SAndroid Build Coastguard Worker
157*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_inc_integer:
test_inc_integer()158*dbb99499SAndroid Build Coastguard Worker extern "C" int test_inc_integer() {
159*dbb99499SAndroid Build Coastguard Worker int x = 0;
160*dbb99499SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) benchmark::DoNotOptimize(++x);
161*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $1, [[DEST:.*]]
162*dbb99499SAndroid Build Coastguard Worker // CHECK: {{(addl \$1,|incl)}} [[DEST]]
163*dbb99499SAndroid Build Coastguard Worker // CHECK: {{(addl \$1,|incl)}} [[DEST]]
164*dbb99499SAndroid Build Coastguard Worker // CHECK: {{(addl \$1,|incl)}} [[DEST]]
165*dbb99499SAndroid Build Coastguard Worker // CHECK: {{(addl \$1,|incl)}} [[DEST]]
166*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG: movl [[DEST]], %eax
167*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
168*dbb99499SAndroid Build Coastguard Worker return x;
169*dbb99499SAndroid Build Coastguard Worker }
170*dbb99499SAndroid Build Coastguard Worker
171*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_pointer_rvalue
test_pointer_rvalue()172*dbb99499SAndroid Build Coastguard Worker extern "C" void test_pointer_rvalue() {
173*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, [[DEST:.*]]
174*dbb99499SAndroid Build Coastguard Worker // CHECK: leaq [[DEST]], %rax
175*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG: movq %rax, -{{[0-9]+}}(%[[REG:[a-z]+]])
176*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
177*dbb99499SAndroid Build Coastguard Worker int x = 42;
178*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(&x);
179*dbb99499SAndroid Build Coastguard Worker }
180*dbb99499SAndroid Build Coastguard Worker
181*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_pointer_const_lvalue:
test_pointer_const_lvalue()182*dbb99499SAndroid Build Coastguard Worker extern "C" void test_pointer_const_lvalue() {
183*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, [[DEST:.*]]
184*dbb99499SAndroid Build Coastguard Worker // CHECK: leaq [[DEST]], %rax
185*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG: movq %rax, -{{[0-9]+}}(%[[REG:[a-z]+]])
186*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
187*dbb99499SAndroid Build Coastguard Worker int x = 42;
188*dbb99499SAndroid Build Coastguard Worker int *const xp = &x;
189*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(xp);
190*dbb99499SAndroid Build Coastguard Worker }
191*dbb99499SAndroid Build Coastguard Worker
192*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_pointer_lvalue:
test_pointer_lvalue()193*dbb99499SAndroid Build Coastguard Worker extern "C" void test_pointer_lvalue() {
194*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $42, [[DEST:.*]]
195*dbb99499SAndroid Build Coastguard Worker // CHECK: leaq [[DEST]], %rax
196*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG: movq %rax, -{{[0-9]+}}(%[[REG:[a-z+]+]])
197*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
198*dbb99499SAndroid Build Coastguard Worker int x = 42;
199*dbb99499SAndroid Build Coastguard Worker int *xp = &x;
200*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(xp);
201*dbb99499SAndroid Build Coastguard Worker }
202