1#include <benchmark/benchmark.h>
2
3#ifdef __clang__
4#pragma clang diagnostic ignored "-Wreturn-type"
5#endif
6
7extern "C" {
8
9extern int ExternInt;
10extern int ExternInt2;
11extern int ExternInt3;
12
13}
14
15// CHECK-LABEL: test_basic:
16extern "C" void test_basic() {
17  int x;
18  benchmark::DoNotOptimize(&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:
27extern "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:
37extern "C" void test_redundant_read() {
38  int x;
39  benchmark::DoNotOptimize(&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:
51extern "C" void test_redundant_read2() {
52  int x;
53  benchmark::DoNotOptimize(&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