1 | #include <benchmark/benchmark.h> |
2 | |
3 | #ifdef __clang__ |
4 | #pragma clang diagnostic ignored "-Wreturn-type" |
5 | #endif |
6 | BENCHMARK_DISABLE_DEPRECATED_WARNING |
7 | |
8 | extern "C" { |
9 | |
10 | extern int ExternInt; |
11 | extern int ExternInt2; |
12 | extern int ExternInt3; |
13 | } |
14 | |
15 | // CHECK-LABEL: test_basic: |
16 | extern "C" void test_basic() { |
17 | int x; |
18 | benchmark::DoNotOptimize(value: &x); |
19 | x = 101; |
20 | benchmark::ClobberMemory(); |
21 | // CHECK: leaq [[DEST:[^,]+]], %rax |
22 | // CHECK: movl $101, [[DEST]] |
23 | // CHECK: ret |
24 | } |
25 | |
26 | // CHECK-LABEL: test_redundant_store: |
27 | extern "C" void test_redundant_store() { |
28 | ExternInt = 3; |
29 | benchmark::ClobberMemory(); |
30 | ExternInt = 51; |
31 | // CHECK-DAG: ExternInt |
32 | // CHECK-DAG: movl $3 |
33 | // CHECK: movl $51 |
34 | } |
35 | |
36 | // CHECK-LABEL: test_redundant_read: |
37 | extern "C" void test_redundant_read() { |
38 | int x; |
39 | benchmark::DoNotOptimize(value: &x); |
40 | x = ExternInt; |
41 | benchmark::ClobberMemory(); |
42 | x = ExternInt2; |
43 | // CHECK: leaq [[DEST:[^,]+]], %rax |
44 | // CHECK: ExternInt(%rip) |
45 | // CHECK: movl %eax, [[DEST]] |
46 | // CHECK-NOT: ExternInt2 |
47 | // CHECK: ret |
48 | } |
49 | |
50 | // CHECK-LABEL: test_redundant_read2: |
51 | extern "C" void test_redundant_read2() { |
52 | int x; |
53 | benchmark::DoNotOptimize(value: &x); |
54 | x = ExternInt; |
55 | benchmark::ClobberMemory(); |
56 | x = ExternInt2; |
57 | benchmark::ClobberMemory(); |
58 | // CHECK: leaq [[DEST:[^,]+]], %rax |
59 | // CHECK: ExternInt(%rip) |
60 | // CHECK: movl %eax, [[DEST]] |
61 | // CHECK: ExternInt2(%rip) |
62 | // CHECK: movl %eax, [[DEST]] |
63 | // CHECK: ret |
64 | } |
65 | |