[Alignment][NFC] Instructions::getLoadStoreAlignment
[llvm-complete.git] / test / Instrumentation / ThreadSanitizer / capture.ll
blob038b8c0cbc922b36f17b27dc9d3cb276197ff137
1 ; RUN: opt < %s -tsan -S | FileCheck %s
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"
5 declare void @escape(i32*)
7 @sink = global i32* null, align 4
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
17 ; CHECK-LABEL: define void @captured0
18 ; CHECK: __tsan_write
19 ; CHECK: ret void
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
29 ; CHECK-LABEL: define void @captured1
30 ; CHECK: __tsan_write
31 ; CHECK: __tsan_write
32 ; CHECK: ret void
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
45 ; CHECK-LABEL: define void @captured2
46 ; CHECK: __tsan_write
47 ; CHECK: __tsan_write
48 ; CHECK: ret void
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
58 ; CHECK-LABEL: define void @notcaptured0
59 ; CHECK: __tsan_write
60 ; CHECK: ret void
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
70 ; CHECK-LABEL: define void @notcaptured1
71 ; CHECK: __tsan_write
72 ; CHECK: __tsan_write
73 ; CHECK: ret void
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
86 ; CHECK-LABEL: define void @notcaptured2
87 ; CHECK: __tsan_write
88 ; CHECK: __tsan_write
89 ; CHECK: ret void