libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

clobber_memory_assembly_test.cc (1361B)


      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:
     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:
     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:
     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:
     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 }