Home | History | Annotate | Download | only in ThreadSanitizer
      1 ; This test checks that we are not instrumenting unwanted acesses to globals:
      2 ; - Instruction profiler counter instrumentation has known intended races.
      3 ; - The gcov counters array has a known intended race.
      4 ;
      5 ; RUN: opt < %s -tsan -S | FileCheck %s
      6 
      7 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
      8 target triple = "x86_64-apple-macosx10.9"
      9 
     10 @__profc_test_gep = private global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
     11 @__profc_test_bitcast = private global [2 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
     12 @__profc_test_bitcast_foo = private global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
     13 
     14 @__llvm_gcov_ctr = internal global [1 x i64] zeroinitializer
     15 @__llvm_gcov_ctr.1 = internal global [1 x i64] zeroinitializer
     16 
     17 define i32 @test_gep() sanitize_thread {
     18 entry:
     19   %pgocount = load i64, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_test_gep, i64 0, i64 0)
     20   %0 = add i64 %pgocount, 1
     21   store i64 %0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_test_gep, i64 0, i64 0)
     22 
     23   %gcovcount = load i64, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__llvm_gcov_ctr, i64 0, i64 0)
     24   %1 = add i64 %gcovcount, 1
     25   store i64 %1, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__llvm_gcov_ctr, i64 0, i64 0)
     26 
     27   %gcovcount.1 = load i64, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__llvm_gcov_ctr.1, i64 0, i64 0)
     28   %2 = add i64 %gcovcount.1, 1
     29   store i64 %2, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__llvm_gcov_ctr.1, i64 0, i64 0)
     30 
     31   ret i32 1
     32 }
     33 
     34 define i32 @test_bitcast() sanitize_thread {
     35 entry:
     36   %0 = load <2 x i64>, <2 x i64>* bitcast ([2 x i64]* @__profc_test_bitcast to <2 x i64>*), align 8
     37   %.promoted5 = load i64, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_test_bitcast_foo, i64 0, i64 0), align 8
     38   %1 = add i64 %.promoted5, 10
     39   %2 = add <2 x i64> %0, <i64 1, i64 10>
     40   store <2 x i64> %2, <2 x i64>* bitcast ([2 x i64]* @__profc_test_bitcast to <2 x i64>*), align 8
     41   store i64 %1, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_test_bitcast_foo, i64 0, i64 0), align 8
     42   ret i32 undef
     43 }
     44 
     45 ; CHECK-NOT: {{call void @__tsan_write}}
     46 ; CHECK: __tsan_init
     47