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