xref: /aosp_15_r20/external/google-benchmark/test/clobber_memory_assembly_test.cc (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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(&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