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