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