1; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
2; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL
3target 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"
4target triple = "x86_64-unknown-linux-gnu"
5
6define void @store0({} %v, {}* %p) {
7  ; COMBINE_PTR_LABEL: @"dfs$store0"
8  ; COMBINE_PTR_LABEL: store
9  ; COMBINE_PTR_LABEL-NOT: store
10
11  ; NO_COMBINE_PTR_LABEL: @"dfs$store0"
12  ; NO_COMBINE_PTR_LABEL: store
13  ; NO_COMBINE_PTR_LABEL-NOT: store
14
15  store {} %v, {}* %p
16  ret void
17}
18
19define void @store8(i8 %v, i8* %p) {
20  ; NO_COMBINE_PTR_LABEL: @"dfs$store8"
21  ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
22  ; NO_COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64
23  ; NO_COMBINE_PTR_LABEL: and i64
24  ; NO_COMBINE_PTR_LABEL: mul i64
25  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
26  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
27  ; NO_COMBINE_PTR_LABEL: store i16
28  ; NO_COMBINE_PTR_LABEL: store i8
29
30  ; COMBINE_PTR_LABEL: @"dfs$store8"
31  ; COMBINE_PTR_LABEL: load i16, i16*
32  ; COMBINE_PTR_LABEL: load i16, i16*
33  ; COMBINE_PTR_LABEL: icmp ne i16
34  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
35  ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} i64
36  ; COMBINE_PTR_LABEL: and i64
37  ; COMBINE_PTR_LABEL: mul i64
38  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
39  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
40  ; COMBINE_PTR_LABEL: store i16
41  ; COMBINE_PTR_LABEL: store i8
42
43  store i8 %v, i8* %p
44  ret void
45}
46
47define void @store16(i16 %v, i16* %p) {
48  ; NO_COMBINE_PTR_LABEL: @"dfs$store16"
49  ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
50  ; NO_COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64
51  ; NO_COMBINE_PTR_LABEL: and i64
52  ; NO_COMBINE_PTR_LABEL: mul i64
53  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
54  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
55  ; NO_COMBINE_PTR_LABEL: store i16
56  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
57  ; NO_COMBINE_PTR_LABEL: store i16
58  ; NO_COMBINE_PTR_LABEL: store i16
59
60  ; COMBINE_PTR_LABEL: @"dfs$store16"
61  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
62  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
63  ; COMBINE_PTR_LABEL: icmp ne i16
64  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
65  ; COMBINE_PTR_LABEL: ptrtoint i16* {{.*}} i64
66  ; COMBINE_PTR_LABEL: and i64
67  ; COMBINE_PTR_LABEL: mul i64
68  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
69  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
70  ; COMBINE_PTR_LABEL: store i16
71  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
72  ; COMBINE_PTR_LABEL: store i16
73  ; COMBINE_PTR_LABEL: store i16
74
75  store i16 %v, i16* %p
76  ret void
77}
78
79define void @store32(i32 %v, i32* %p) {
80  ; NO_COMBINE_PTR_LABEL: @"dfs$store32"
81  ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
82  ; NO_COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64
83  ; NO_COMBINE_PTR_LABEL: and i64
84  ; NO_COMBINE_PTR_LABEL: mul i64
85  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
86  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
87  ; NO_COMBINE_PTR_LABEL: store i16
88  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
89  ; NO_COMBINE_PTR_LABEL: store i16
90  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
91  ; NO_COMBINE_PTR_LABEL: store i16
92  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
93  ; NO_COMBINE_PTR_LABEL: store i16
94  ; NO_COMBINE_PTR_LABEL: store i32
95
96  ; COMBINE_PTR_LABEL: @"dfs$store32"
97  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
98  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
99  ; COMBINE_PTR_LABEL: icmp ne i16
100  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
101  ; COMBINE_PTR_LABEL: ptrtoint i32* {{.*}} i64
102  ; COMBINE_PTR_LABEL: and i64
103  ; COMBINE_PTR_LABEL: mul i64
104  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
105  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
106  ; COMBINE_PTR_LABEL: store i16
107  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
108  ; COMBINE_PTR_LABEL: store i16
109  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
110  ; COMBINE_PTR_LABEL: store i16
111  ; COMBINE_PTR_LABEL: getelementptr i16, i16*
112  ; COMBINE_PTR_LABEL: store i16
113  ; COMBINE_PTR_LABEL: store i32
114
115  store i32 %v, i32* %p
116  ret void
117}
118
119define void @store64(i64 %v, i64* %p) {
120  ; NO_COMBINE_PTR_LABEL: @"dfs$store64"
121  ; NO_COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
122  ; NO_COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64
123  ; NO_COMBINE_PTR_LABEL: and i64
124  ; NO_COMBINE_PTR_LABEL: mul i64
125  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
126  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
127  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
128  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
129  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
130  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
131  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
132  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
133  ; NO_COMBINE_PTR_LABEL: insertelement {{.*}} i16
134  ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>*
135  ; NO_COMBINE_PTR_LABEL: store i64
136
137  ; COMBINE_PTR_LABEL: @"dfs$store64"
138  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
139  ; COMBINE_PTR_LABEL: load i16, i16* {{.*}} @__dfsan_arg_tls
140  ; COMBINE_PTR_LABEL: icmp ne i16
141  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
142  ; COMBINE_PTR_LABEL: ptrtoint i64* {{.*}} i64
143  ; COMBINE_PTR_LABEL: and i64
144  ; COMBINE_PTR_LABEL: mul i64
145  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
146  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
147  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
148  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
149  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
150  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
151  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
152  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
153  ; COMBINE_PTR_LABEL: insertelement {{.*}} i16
154  ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} <8 x i16>*
155  ; COMBINE_PTR_LABEL: store <8 x i16>
156  ; COMBINE_PTR_LABEL: store i64
157
158  store i64 %v, i64* %p
159  ret void
160}
161