| #include <benchmark/benchmark.h> |
| |
| #ifdef __clang__ |
| #pragma clang diagnostic ignored "-Wreturn-type" |
| #endif |
| |
| extern "C" { |
| |
| extern int ExternInt; |
| extern int ExternInt2; |
| extern int ExternInt3; |
| |
| } |
| |
| // CHECK-LABEL: test_basic: |
| extern "C" void test_basic() { |
| int x; |
| benchmark::DoNotOptimize(&x); |
| x = 101; |
| benchmark::ClobberMemory(); |
| // CHECK: leaq [[DEST:[^,]+]], %rax |
| // CHECK: movl $101, [[DEST]] |
| // CHECK: ret |
| } |
| |
| // CHECK-LABEL: test_redundant_store: |
| extern "C" void test_redundant_store() { |
| ExternInt = 3; |
| benchmark::ClobberMemory(); |
| ExternInt = 51; |
| // CHECK-DAG: ExternInt |
| // CHECK-DAG: movl $3 |
| // CHECK: movl $51 |
| } |
| |
| // CHECK-LABEL: test_redundant_read: |
| extern "C" void test_redundant_read() { |
| int x; |
| benchmark::DoNotOptimize(&x); |
| x = ExternInt; |
| benchmark::ClobberMemory(); |
| x = ExternInt2; |
| // CHECK: leaq [[DEST:[^,]+]], %rax |
| // CHECK: ExternInt(%rip) |
| // CHECK: movl %eax, [[DEST]] |
| // CHECK-NOT: ExternInt2 |
| // CHECK: ret |
| } |
| |
| // CHECK-LABEL: test_redundant_read2: |
| extern "C" void test_redundant_read2() { |
| int x; |
| benchmark::DoNotOptimize(&x); |
| x = ExternInt; |
| benchmark::ClobberMemory(); |
| x = ExternInt2; |
| benchmark::ClobberMemory(); |
| // CHECK: leaq [[DEST:[^,]+]], %rax |
| // CHECK: ExternInt(%rip) |
| // CHECK: movl %eax, [[DEST]] |
| // CHECK: ExternInt2(%rip) |
| // CHECK: movl %eax, [[DEST]] |
| // CHECK: ret |
| } |