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
7*dbb99499SAndroid Build Coastguard Worker // clang-format off
8*dbb99499SAndroid Build Coastguard Worker extern "C" {
9*dbb99499SAndroid Build Coastguard Worker extern int ExternInt;
10*dbb99499SAndroid Build Coastguard Worker benchmark::State& GetState();
11*dbb99499SAndroid Build Coastguard Worker void Fn();
12*dbb99499SAndroid Build Coastguard Worker }
13*dbb99499SAndroid Build Coastguard Worker // clang-format on
14*dbb99499SAndroid Build Coastguard Worker
15*dbb99499SAndroid Build Coastguard Worker using benchmark::State;
16*dbb99499SAndroid Build Coastguard Worker
17*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_for_auto_loop:
test_for_auto_loop()18*dbb99499SAndroid Build Coastguard Worker extern "C" int test_for_auto_loop() {
19*dbb99499SAndroid Build Coastguard Worker State& S = GetState();
20*dbb99499SAndroid Build Coastguard Worker int x = 42;
21*dbb99499SAndroid Build Coastguard Worker // CHECK: [[CALL:call(q)*]] _ZN9benchmark5State16StartKeepRunningEv
22*dbb99499SAndroid Build Coastguard Worker // CHECK-NEXT: testq %rbx, %rbx
23*dbb99499SAndroid Build Coastguard Worker // CHECK-NEXT: je [[LOOP_END:.*]]
24*dbb99499SAndroid Build Coastguard Worker
25*dbb99499SAndroid Build Coastguard Worker for (auto _ : S) {
26*dbb99499SAndroid Build Coastguard Worker // CHECK: .L[[LOOP_HEAD:[a-zA-Z0-9_]+]]:
27*dbb99499SAndroid Build Coastguard Worker // CHECK-GNU-NEXT: subq $1, %rbx
28*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG-NEXT: {{(addq \$1, %rax|incq %rax|addq \$-1, %rbx)}}
29*dbb99499SAndroid Build Coastguard Worker // CHECK-NEXT: jne .L[[LOOP_HEAD]]
30*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x);
31*dbb99499SAndroid Build Coastguard Worker }
32*dbb99499SAndroid Build Coastguard Worker // CHECK: [[LOOP_END]]:
33*dbb99499SAndroid Build Coastguard Worker // CHECK: [[CALL]] _ZN9benchmark5State17FinishKeepRunningEv
34*dbb99499SAndroid Build Coastguard Worker
35*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $101, %eax
36*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
37*dbb99499SAndroid Build Coastguard Worker return 101;
38*dbb99499SAndroid Build Coastguard Worker }
39*dbb99499SAndroid Build Coastguard Worker
40*dbb99499SAndroid Build Coastguard Worker // CHECK-LABEL: test_while_loop:
test_while_loop()41*dbb99499SAndroid Build Coastguard Worker extern "C" int test_while_loop() {
42*dbb99499SAndroid Build Coastguard Worker State& S = GetState();
43*dbb99499SAndroid Build Coastguard Worker int x = 42;
44*dbb99499SAndroid Build Coastguard Worker
45*dbb99499SAndroid Build Coastguard Worker // CHECK: j{{(e|mp)}} .L[[LOOP_HEADER:[a-zA-Z0-9_]+]]
46*dbb99499SAndroid Build Coastguard Worker // CHECK-NEXT: .L[[LOOP_BODY:[a-zA-Z0-9_]+]]:
47*dbb99499SAndroid Build Coastguard Worker while (S.KeepRunning()) {
48*dbb99499SAndroid Build Coastguard Worker // CHECK-GNU-NEXT: subq $1, %[[IREG:[a-z]+]]
49*dbb99499SAndroid Build Coastguard Worker // CHECK-CLANG-NEXT: {{(addq \$-1,|decq)}} %[[IREG:[a-z]+]]
50*dbb99499SAndroid Build Coastguard Worker // CHECK: movq %[[IREG]], [[DEST:.*]]
51*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x);
52*dbb99499SAndroid Build Coastguard Worker }
53*dbb99499SAndroid Build Coastguard Worker // CHECK-DAG: movq [[DEST]], %[[IREG]]
54*dbb99499SAndroid Build Coastguard Worker // CHECK-DAG: testq %[[IREG]], %[[IREG]]
55*dbb99499SAndroid Build Coastguard Worker // CHECK-DAG: jne .L[[LOOP_BODY]]
56*dbb99499SAndroid Build Coastguard Worker // CHECK-DAG: .L[[LOOP_HEADER]]:
57*dbb99499SAndroid Build Coastguard Worker
58*dbb99499SAndroid Build Coastguard Worker // CHECK: cmpb $0
59*dbb99499SAndroid Build Coastguard Worker // CHECK-NEXT: jne .L[[LOOP_END:[a-zA-Z0-9_]+]]
60*dbb99499SAndroid Build Coastguard Worker // CHECK: [[CALL:call(q)*]] _ZN9benchmark5State16StartKeepRunningEv
61*dbb99499SAndroid Build Coastguard Worker
62*dbb99499SAndroid Build Coastguard Worker // CHECK: .L[[LOOP_END]]:
63*dbb99499SAndroid Build Coastguard Worker // CHECK: [[CALL]] _ZN9benchmark5State17FinishKeepRunningEv
64*dbb99499SAndroid Build Coastguard Worker
65*dbb99499SAndroid Build Coastguard Worker // CHECK: movl $101, %eax
66*dbb99499SAndroid Build Coastguard Worker // CHECK: ret
67*dbb99499SAndroid Build Coastguard Worker return 101;
68*dbb99499SAndroid Build Coastguard Worker }
69