1 ; RUN: opt < %s -tsan -S | FileCheck %s 2 3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 4 5 declare void @escape(i32*) 6 7 @sink = global i32* null, align 4 8 9 define void @captured0() nounwind uwtable sanitize_thread { 10 entry: 11 %ptr = alloca i32, align 4 12 ; escapes due to call 13 call void @escape(i32* %ptr) 14 store i32 42, i32* %ptr, align 4 15 ret void 16 } 17 ; CHECK-LABEL: define void @captured0 18 ; CHECK: __tsan_write 19 ; CHECK: ret void 20 21 define void @captured1() nounwind uwtable sanitize_thread { 22 entry: 23 %ptr = alloca i32, align 4 24 ; escapes due to store into global 25 store i32* %ptr, i32** @sink, align 8 26 store i32 42, i32* %ptr, align 4 27 ret void 28 } 29 ; CHECK-LABEL: define void @captured1 30 ; CHECK: __tsan_write 31 ; CHECK: __tsan_write 32 ; CHECK: ret void 33 34 define void @captured2() nounwind uwtable sanitize_thread { 35 entry: 36 %ptr = alloca i32, align 4 37 %tmp = alloca i32*, align 8 38 ; transitive escape 39 store i32* %ptr, i32** %tmp, align 8 40 %0 = load i32*, i32** %tmp, align 8 41 store i32* %0, i32** @sink, align 8 42 store i32 42, i32* %ptr, align 4 43 ret void 44 } 45 ; CHECK-LABEL: define void @captured2 46 ; CHECK: __tsan_write 47 ; CHECK: __tsan_write 48 ; CHECK: ret void 49 50 define void @notcaptured0() nounwind uwtable sanitize_thread { 51 entry: 52 %ptr = alloca i32, align 4 53 store i32 42, i32* %ptr, align 4 54 ; escapes due to call 55 call void @escape(i32* %ptr) 56 ret void 57 } 58 ; CHECK-LABEL: define void @notcaptured0 59 ; CHECK: __tsan_write 60 ; CHECK: ret void 61 62 define void @notcaptured1() nounwind uwtable sanitize_thread { 63 entry: 64 %ptr = alloca i32, align 4 65 store i32 42, i32* %ptr, align 4 66 ; escapes due to store into global 67 store i32* %ptr, i32** @sink, align 8 68 ret void 69 } 70 ; CHECK-LABEL: define void @notcaptured1 71 ; CHECK: __tsan_write 72 ; CHECK: __tsan_write 73 ; CHECK: ret void 74 75 define void @notcaptured2() nounwind uwtable sanitize_thread { 76 entry: 77 %ptr = alloca i32, align 4 78 %tmp = alloca i32*, align 8 79 store i32 42, i32* %ptr, align 4 80 ; transitive escape 81 store i32* %ptr, i32** %tmp, align 8 82 %0 = load i32*, i32** %tmp, align 8 83 store i32* %0, i32** @sink, align 8 84 ret void 85 } 86 ; CHECK-LABEL: define void @notcaptured2 87 ; CHECK: __tsan_write 88 ; CHECK: __tsan_write 89 ; CHECK: ret void 90 91 92