1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
3 ; Test memory sanitizer instrumentation for Arm store with lane instructions.
4 ; Note: st{2,3,4}lane uses Arm NEON but st1lane does not.
6 ; RUN: opt < %s -passes=msan -S | FileCheck %s
8 ; Forked from llvm/test/CodeGen/AArch64/arm64-st1.ll
10 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
11 target triple = "aarch64--linux-android9001"
13 define void @st1lane_16b(<16 x i8> %A, ptr %D) sanitize_memory {
14 ; CHECK-LABEL: define void @st1lane_16b(
15 ; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {
16 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
17 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
18 ; CHECK-NEXT: call void @llvm.donothing()
19 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
20 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 1
21 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 1
22 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 1
23 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
24 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0:![0-9]+]]
26 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
27 ; CHECK-NEXT: unreachable
29 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
30 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
31 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
32 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 1
33 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
34 ; CHECK-NEXT: ret void
36 %ptr = getelementptr i8, ptr %D, i64 1
37 %tmp = extractelement <16 x i8> %A, i32 1
38 store i8 %tmp, ptr %ptr
42 define void @st1lane0_16b(<16 x i8> %A, ptr %D) sanitize_memory {
43 ; CHECK-LABEL: define void @st1lane0_16b(
44 ; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
45 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
46 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
47 ; CHECK-NEXT: call void @llvm.donothing()
48 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
49 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 1
50 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 0
51 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 0
52 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
53 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
55 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
56 ; CHECK-NEXT: unreachable
58 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
59 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
60 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
61 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 1
62 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
63 ; CHECK-NEXT: ret void
65 %ptr = getelementptr i8, ptr %D, i64 1
66 %tmp = extractelement <16 x i8> %A, i32 0
67 store i8 %tmp, ptr %ptr
71 define void @st1lane0u_16b(<16 x i8> %A, ptr %D) sanitize_memory {
72 ; CHECK-LABEL: define void @st1lane0u_16b(
73 ; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
74 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
75 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
76 ; CHECK-NEXT: call void @llvm.donothing()
77 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
78 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 -1
79 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 0
80 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 0
81 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
82 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
84 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
85 ; CHECK-NEXT: unreachable
87 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
88 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
89 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
90 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 1
91 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
92 ; CHECK-NEXT: ret void
94 %ptr = getelementptr i8, ptr %D, i64 -1
95 %tmp = extractelement <16 x i8> %A, i32 0
96 store i8 %tmp, ptr %ptr
100 define void @st1lane_ro_16b(<16 x i8> %A, ptr %D, i64 %offset) sanitize_memory {
101 ; CHECK-LABEL: define void @st1lane_ro_16b(
102 ; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
103 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
104 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
105 ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
106 ; CHECK-NEXT: call void @llvm.donothing()
107 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
108 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]
109 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP3]], i32 1
110 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 1
111 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
112 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
114 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
115 ; CHECK-NEXT: unreachable
117 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
118 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
119 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
120 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1
121 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
122 ; CHECK-NEXT: ret void
124 %ptr = getelementptr i8, ptr %D, i64 %offset
125 %tmp = extractelement <16 x i8> %A, i32 1
126 store i8 %tmp, ptr %ptr
130 define void @st1lane0_ro_16b(<16 x i8> %A, ptr %D, i64 %offset) sanitize_memory {
131 ; CHECK-LABEL: define void @st1lane0_ro_16b(
132 ; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
133 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
134 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
135 ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
136 ; CHECK-NEXT: call void @llvm.donothing()
137 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
138 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]
139 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP3]], i32 0
140 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 0
141 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
142 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
144 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
145 ; CHECK-NEXT: unreachable
147 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
148 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
149 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
150 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1
151 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
152 ; CHECK-NEXT: ret void
154 %ptr = getelementptr i8, ptr %D, i64 %offset
155 %tmp = extractelement <16 x i8> %A, i32 0
156 store i8 %tmp, ptr %ptr
160 define void @st1lane_8h(<8 x i16> %A, ptr %D) sanitize_memory {
161 ; CHECK-LABEL: define void @st1lane_8h(
162 ; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
163 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
164 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
165 ; CHECK-NEXT: call void @llvm.donothing()
166 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
167 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1
168 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 1
169 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 1
170 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
171 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
173 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
174 ; CHECK-NEXT: unreachable
176 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
177 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
178 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
179 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
180 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
181 ; CHECK-NEXT: ret void
183 %ptr = getelementptr i16, ptr %D, i64 1
184 %tmp = extractelement <8 x i16> %A, i32 1
185 store i16 %tmp, ptr %ptr
189 define void @st1lane0_8h(<8 x i16> %A, ptr %D) sanitize_memory {
190 ; CHECK-LABEL: define void @st1lane0_8h(
191 ; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
192 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
193 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
194 ; CHECK-NEXT: call void @llvm.donothing()
195 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
196 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1
197 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 0
198 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0
199 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
200 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
202 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
203 ; CHECK-NEXT: unreachable
205 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
206 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
207 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
208 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
209 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
210 ; CHECK-NEXT: ret void
212 %ptr = getelementptr i16, ptr %D, i64 1
213 %tmp = extractelement <8 x i16> %A, i32 0
214 store i16 %tmp, ptr %ptr
218 define void @st1lane0u_8h(<8 x i16> %A, ptr %D) sanitize_memory {
219 ; CHECK-LABEL: define void @st1lane0u_8h(
220 ; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
221 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
222 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
223 ; CHECK-NEXT: call void @llvm.donothing()
224 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
225 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 -1
226 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 0
227 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0
228 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
229 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
231 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
232 ; CHECK-NEXT: unreachable
234 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
235 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
236 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
237 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
238 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
239 ; CHECK-NEXT: ret void
241 %ptr = getelementptr i16, ptr %D, i64 -1
242 %tmp = extractelement <8 x i16> %A, i32 0
243 store i16 %tmp, ptr %ptr
247 define void @st1lane_ro_8h(<8 x i16> %A, ptr %D, i64 %offset) sanitize_memory {
248 ; CHECK-LABEL: define void @st1lane_ro_8h(
249 ; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
250 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
251 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
252 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
253 ; CHECK-NEXT: call void @llvm.donothing()
254 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
255 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]
256 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP3]], i32 1
257 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 1
258 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
259 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
261 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
262 ; CHECK-NEXT: unreachable
264 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
265 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
266 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
267 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2
268 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
269 ; CHECK-NEXT: ret void
271 %ptr = getelementptr i16, ptr %D, i64 %offset
272 %tmp = extractelement <8 x i16> %A, i32 1
273 store i16 %tmp, ptr %ptr
277 define void @st1lane0_ro_8h(<8 x i16> %A, ptr %D, i64 %offset) sanitize_memory {
278 ; CHECK-LABEL: define void @st1lane0_ro_8h(
279 ; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
280 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
281 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
282 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
283 ; CHECK-NEXT: call void @llvm.donothing()
284 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
285 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]
286 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP3]], i32 0
287 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0
288 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
289 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
291 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
292 ; CHECK-NEXT: unreachable
294 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
295 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
296 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
297 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2
298 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
299 ; CHECK-NEXT: ret void
301 %ptr = getelementptr i16, ptr %D, i64 %offset
302 %tmp = extractelement <8 x i16> %A, i32 0
303 store i16 %tmp, ptr %ptr
307 define void @st1lane_4s(<4 x i32> %A, ptr %D) sanitize_memory {
308 ; CHECK-LABEL: define void @st1lane_4s(
309 ; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
310 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
311 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
312 ; CHECK-NEXT: call void @llvm.donothing()
313 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
314 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1
315 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 1
316 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 1
317 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
318 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
320 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
321 ; CHECK-NEXT: unreachable
323 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
324 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
325 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
326 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
327 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
328 ; CHECK-NEXT: ret void
330 %ptr = getelementptr i32, ptr %D, i64 1
331 %tmp = extractelement <4 x i32> %A, i32 1
332 store i32 %tmp, ptr %ptr
336 define void @st1lane0_4s(<4 x i32> %A, ptr %D) sanitize_memory {
337 ; CHECK-LABEL: define void @st1lane0_4s(
338 ; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
339 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
340 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
341 ; CHECK-NEXT: call void @llvm.donothing()
342 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
343 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1
344 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0
345 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0
346 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
347 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
349 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
350 ; CHECK-NEXT: unreachable
352 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
353 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
354 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
355 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
356 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
357 ; CHECK-NEXT: ret void
359 %ptr = getelementptr i32, ptr %D, i64 1
360 %tmp = extractelement <4 x i32> %A, i32 0
361 store i32 %tmp, ptr %ptr
365 define void @st1lane0u_4s(<4 x i32> %A, ptr %D) sanitize_memory {
366 ; CHECK-LABEL: define void @st1lane0u_4s(
367 ; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
368 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
369 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
370 ; CHECK-NEXT: call void @llvm.donothing()
371 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
372 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 -1
373 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0
374 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0
375 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
376 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
378 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
379 ; CHECK-NEXT: unreachable
381 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
382 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
383 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
384 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
385 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
386 ; CHECK-NEXT: ret void
388 %ptr = getelementptr i32, ptr %D, i64 -1
389 %tmp = extractelement <4 x i32> %A, i32 0
390 store i32 %tmp, ptr %ptr
394 define void @st1lane_ro_4s(<4 x i32> %A, ptr %D, i64 %offset) sanitize_memory {
395 ; CHECK-LABEL: define void @st1lane_ro_4s(
396 ; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
397 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
398 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
399 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
400 ; CHECK-NEXT: call void @llvm.donothing()
401 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
402 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]
403 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 1
404 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 1
405 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
406 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
408 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
409 ; CHECK-NEXT: unreachable
411 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
412 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
413 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
414 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
415 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
416 ; CHECK-NEXT: ret void
418 %ptr = getelementptr i32, ptr %D, i64 %offset
419 %tmp = extractelement <4 x i32> %A, i32 1
420 store i32 %tmp, ptr %ptr
424 define void @st1lane0_ro_4s(<4 x i32> %A, ptr %D, i64 %offset) sanitize_memory {
425 ; CHECK-LABEL: define void @st1lane0_ro_4s(
426 ; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
427 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
428 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
429 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
430 ; CHECK-NEXT: call void @llvm.donothing()
431 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
432 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]
433 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 0
434 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0
435 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
436 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
438 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
439 ; CHECK-NEXT: unreachable
441 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
442 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
443 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
444 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
445 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
446 ; CHECK-NEXT: ret void
448 %ptr = getelementptr i32, ptr %D, i64 %offset
449 %tmp = extractelement <4 x i32> %A, i32 0
450 store i32 %tmp, ptr %ptr
454 define void @st1lane_4s_float(<4 x float> %A, ptr %D) sanitize_memory {
455 ; CHECK-LABEL: define void @st1lane_4s_float(
456 ; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
457 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
458 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
459 ; CHECK-NEXT: call void @llvm.donothing()
460 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
461 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1
462 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 1
463 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 1
464 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
465 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
467 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
468 ; CHECK-NEXT: unreachable
470 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
471 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
472 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
473 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
474 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
475 ; CHECK-NEXT: ret void
477 %ptr = getelementptr float, ptr %D, i64 1
478 %tmp = extractelement <4 x float> %A, i32 1
479 store float %tmp, ptr %ptr
483 define void @st1lane0_4s_float(<4 x float> %A, ptr %D) sanitize_memory {
484 ; CHECK-LABEL: define void @st1lane0_4s_float(
485 ; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
486 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
487 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
488 ; CHECK-NEXT: call void @llvm.donothing()
489 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
490 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1
491 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0
492 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0
493 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
494 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
496 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
497 ; CHECK-NEXT: unreachable
499 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
500 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
501 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
502 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
503 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
504 ; CHECK-NEXT: ret void
506 %ptr = getelementptr float, ptr %D, i64 1
507 %tmp = extractelement <4 x float> %A, i32 0
508 store float %tmp, ptr %ptr
512 define void @st1lane0u_4s_float(<4 x float> %A, ptr %D) sanitize_memory {
513 ; CHECK-LABEL: define void @st1lane0u_4s_float(
514 ; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
515 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
516 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
517 ; CHECK-NEXT: call void @llvm.donothing()
518 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
519 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 -1
520 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0
521 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0
522 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
523 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
525 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
526 ; CHECK-NEXT: unreachable
528 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
529 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
530 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
531 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
532 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
533 ; CHECK-NEXT: ret void
535 %ptr = getelementptr float, ptr %D, i64 -1
536 %tmp = extractelement <4 x float> %A, i32 0
537 store float %tmp, ptr %ptr
541 define void @st1lane_ro_4s_float(<4 x float> %A, ptr %D, i64 %offset) sanitize_memory {
542 ; CHECK-LABEL: define void @st1lane_ro_4s_float(
543 ; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
544 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
545 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
546 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
547 ; CHECK-NEXT: call void @llvm.donothing()
548 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
549 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]
550 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 1
551 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 1
552 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
553 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
555 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
556 ; CHECK-NEXT: unreachable
558 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
559 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
560 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
561 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
562 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
563 ; CHECK-NEXT: ret void
565 %ptr = getelementptr float, ptr %D, i64 %offset
566 %tmp = extractelement <4 x float> %A, i32 1
567 store float %tmp, ptr %ptr
571 define void @st1lane0_ro_4s_float(<4 x float> %A, ptr %D, i64 %offset) sanitize_memory {
572 ; CHECK-LABEL: define void @st1lane0_ro_4s_float(
573 ; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
574 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
575 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
576 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
577 ; CHECK-NEXT: call void @llvm.donothing()
578 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
579 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]
580 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 0
581 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0
582 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
583 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
585 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
586 ; CHECK-NEXT: unreachable
588 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
589 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
590 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
591 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
592 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
593 ; CHECK-NEXT: ret void
595 %ptr = getelementptr float, ptr %D, i64 %offset
596 %tmp = extractelement <4 x float> %A, i32 0
597 store float %tmp, ptr %ptr
601 define void @st1lane_2d(<2 x i64> %A, ptr %D) sanitize_memory {
602 ; CHECK-LABEL: define void @st1lane_2d(
603 ; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
604 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
605 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
606 ; CHECK-NEXT: call void @llvm.donothing()
607 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
608 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 1
609 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 1
610 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 1
611 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
612 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
614 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
615 ; CHECK-NEXT: unreachable
617 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
618 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
619 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
620 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
621 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
622 ; CHECK-NEXT: ret void
624 %ptr = getelementptr i64, ptr %D, i64 1
625 %tmp = extractelement <2 x i64> %A, i32 1
626 store i64 %tmp, ptr %ptr
630 define void @st1lane0_2d(<2 x i64> %A, ptr %D) sanitize_memory {
631 ; CHECK-LABEL: define void @st1lane0_2d(
632 ; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
633 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
634 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
635 ; CHECK-NEXT: call void @llvm.donothing()
636 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
637 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 1
638 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0
639 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0
640 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
641 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
643 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
644 ; CHECK-NEXT: unreachable
646 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
647 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
648 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
649 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
650 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
651 ; CHECK-NEXT: ret void
653 %ptr = getelementptr i64, ptr %D, i64 1
654 %tmp = extractelement <2 x i64> %A, i32 0
655 store i64 %tmp, ptr %ptr
659 define void @st1lane0u_2d(<2 x i64> %A, ptr %D) sanitize_memory {
660 ; CHECK-LABEL: define void @st1lane0u_2d(
661 ; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
662 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
663 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
664 ; CHECK-NEXT: call void @llvm.donothing()
665 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
666 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 -1
667 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0
668 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0
669 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
670 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
672 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
673 ; CHECK-NEXT: unreachable
675 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
676 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
677 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
678 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
679 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
680 ; CHECK-NEXT: ret void
682 %ptr = getelementptr i64, ptr %D, i64 -1
683 %tmp = extractelement <2 x i64> %A, i32 0
684 store i64 %tmp, ptr %ptr
688 define void @st1lane_ro_2d(<2 x i64> %A, ptr %D, i64 %offset) sanitize_memory {
689 ; CHECK-LABEL: define void @st1lane_ro_2d(
690 ; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
691 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
692 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
693 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
694 ; CHECK-NEXT: call void @llvm.donothing()
695 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
696 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]
697 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 1
698 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 1
699 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
700 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
702 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
703 ; CHECK-NEXT: unreachable
705 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
706 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
707 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
708 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
709 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
710 ; CHECK-NEXT: ret void
712 %ptr = getelementptr i64, ptr %D, i64 %offset
713 %tmp = extractelement <2 x i64> %A, i32 1
714 store i64 %tmp, ptr %ptr
718 define void @st1lane0_ro_2d(<2 x i64> %A, ptr %D, i64 %offset) sanitize_memory {
719 ; CHECK-LABEL: define void @st1lane0_ro_2d(
720 ; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
721 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
722 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
723 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
724 ; CHECK-NEXT: call void @llvm.donothing()
725 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
726 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]
727 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 0
728 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0
729 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
730 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
732 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
733 ; CHECK-NEXT: unreachable
735 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
736 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
737 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
738 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
739 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
740 ; CHECK-NEXT: ret void
742 %ptr = getelementptr i64, ptr %D, i64 %offset
743 %tmp = extractelement <2 x i64> %A, i32 0
744 store i64 %tmp, ptr %ptr
748 define void @st1lane_2d_double(<2 x double> %A, ptr %D) sanitize_memory {
749 ; CHECK-LABEL: define void @st1lane_2d_double(
750 ; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
751 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
752 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
753 ; CHECK-NEXT: call void @llvm.donothing()
754 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
755 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 1
756 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 1
757 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 1
758 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
759 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
761 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
762 ; CHECK-NEXT: unreachable
764 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
765 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
766 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
767 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
768 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
769 ; CHECK-NEXT: ret void
771 %ptr = getelementptr double, ptr %D, i64 1
772 %tmp = extractelement <2 x double> %A, i32 1
773 store double %tmp, ptr %ptr
777 define void @st1lane0_2d_double(<2 x double> %A, ptr %D) sanitize_memory {
778 ; CHECK-LABEL: define void @st1lane0_2d_double(
779 ; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
780 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
781 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
782 ; CHECK-NEXT: call void @llvm.donothing()
783 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
784 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 1
785 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0
786 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0
787 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
788 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
790 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
791 ; CHECK-NEXT: unreachable
793 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
794 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
795 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
796 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
797 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
798 ; CHECK-NEXT: ret void
800 %ptr = getelementptr double, ptr %D, i64 1
801 %tmp = extractelement <2 x double> %A, i32 0
802 store double %tmp, ptr %ptr
806 define void @st1lane0u_2d_double(<2 x double> %A, ptr %D) sanitize_memory {
807 ; CHECK-LABEL: define void @st1lane0u_2d_double(
808 ; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
809 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
810 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
811 ; CHECK-NEXT: call void @llvm.donothing()
812 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
813 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 -1
814 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0
815 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0
816 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
817 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
819 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
820 ; CHECK-NEXT: unreachable
822 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
823 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
824 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
825 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
826 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
827 ; CHECK-NEXT: ret void
829 %ptr = getelementptr double, ptr %D, i64 -1
830 %tmp = extractelement <2 x double> %A, i32 0
831 store double %tmp, ptr %ptr
835 define void @st1lane_ro_2d_double(<2 x double> %A, ptr %D, i64 %offset) sanitize_memory {
836 ; CHECK-LABEL: define void @st1lane_ro_2d_double(
837 ; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
838 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
839 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
840 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
841 ; CHECK-NEXT: call void @llvm.donothing()
842 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
843 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]
844 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 1
845 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 1
846 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
847 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
849 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
850 ; CHECK-NEXT: unreachable
852 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
853 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
854 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
855 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
856 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
857 ; CHECK-NEXT: ret void
859 %ptr = getelementptr double, ptr %D, i64 %offset
860 %tmp = extractelement <2 x double> %A, i32 1
861 store double %tmp, ptr %ptr
865 define void @st1lane0_ro_2d_double(<2 x double> %A, ptr %D, i64 %offset) sanitize_memory {
866 ; CHECK-LABEL: define void @st1lane0_ro_2d_double(
867 ; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
868 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
869 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8
870 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
871 ; CHECK-NEXT: call void @llvm.donothing()
872 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
873 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]
874 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 0
875 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0
876 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
877 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
879 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
880 ; CHECK-NEXT: unreachable
882 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
883 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
884 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
885 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
886 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
887 ; CHECK-NEXT: ret void
889 %ptr = getelementptr double, ptr %D, i64 %offset
890 %tmp = extractelement <2 x double> %A, i32 0
891 store double %tmp, ptr %ptr
895 define void @st1lane_8b(<8 x i8> %A, ptr %D) sanitize_memory {
896 ; CHECK-LABEL: define void @st1lane_8b(
897 ; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
898 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
899 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8
900 ; CHECK-NEXT: call void @llvm.donothing()
901 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
902 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 1
903 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP2]], i32 1
904 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 1
905 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
906 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
908 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
909 ; CHECK-NEXT: unreachable
911 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
912 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
913 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
914 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 1
915 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
916 ; CHECK-NEXT: ret void
918 %ptr = getelementptr i8, ptr %D, i64 1
919 %tmp = extractelement <8 x i8> %A, i32 1
920 store i8 %tmp, ptr %ptr
924 define void @st1lane_ro_8b(<8 x i8> %A, ptr %D, i64 %offset) sanitize_memory {
925 ; CHECK-LABEL: define void @st1lane_ro_8b(
926 ; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
927 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
928 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
929 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8
930 ; CHECK-NEXT: call void @llvm.donothing()
931 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
932 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]
933 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP3]], i32 1
934 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 1
935 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
936 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
938 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
939 ; CHECK-NEXT: unreachable
941 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
942 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
943 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
944 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1
945 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
946 ; CHECK-NEXT: ret void
948 %ptr = getelementptr i8, ptr %D, i64 %offset
949 %tmp = extractelement <8 x i8> %A, i32 1
950 store i8 %tmp, ptr %ptr
954 define void @st1lane0_ro_8b(<8 x i8> %A, ptr %D, i64 %offset) sanitize_memory {
955 ; CHECK-LABEL: define void @st1lane0_ro_8b(
956 ; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
957 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
958 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
959 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8
960 ; CHECK-NEXT: call void @llvm.donothing()
961 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
962 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]
963 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP3]], i32 0
964 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 0
965 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
966 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
968 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
969 ; CHECK-NEXT: unreachable
971 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
972 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
973 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
974 ; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1
975 ; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1
976 ; CHECK-NEXT: ret void
978 %ptr = getelementptr i8, ptr %D, i64 %offset
979 %tmp = extractelement <8 x i8> %A, i32 0
980 store i8 %tmp, ptr %ptr
984 define void @st1lane_4h(<4 x i16> %A, ptr %D) sanitize_memory {
985 ; CHECK-LABEL: define void @st1lane_4h(
986 ; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
987 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
988 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
989 ; CHECK-NEXT: call void @llvm.donothing()
990 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
991 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1
992 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 1
993 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 1
994 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
995 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
997 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
998 ; CHECK-NEXT: unreachable
1000 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1001 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1002 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1003 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
1004 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
1005 ; CHECK-NEXT: ret void
1007 %ptr = getelementptr i16, ptr %D, i64 1
1008 %tmp = extractelement <4 x i16> %A, i32 1
1009 store i16 %tmp, ptr %ptr
1013 define void @st1lane0_4h(<4 x i16> %A, ptr %D) sanitize_memory {
1014 ; CHECK-LABEL: define void @st1lane0_4h(
1015 ; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1016 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1017 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
1018 ; CHECK-NEXT: call void @llvm.donothing()
1019 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1020 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1
1021 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 0
1022 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 0
1023 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1024 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1026 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1027 ; CHECK-NEXT: unreachable
1029 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1030 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1031 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1032 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
1033 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
1034 ; CHECK-NEXT: ret void
1036 %ptr = getelementptr i16, ptr %D, i64 1
1037 %tmp = extractelement <4 x i16> %A, i32 0
1038 store i16 %tmp, ptr %ptr
1042 define void @st1lane0u_4h(<4 x i16> %A, ptr %D) sanitize_memory {
1043 ; CHECK-LABEL: define void @st1lane0u_4h(
1044 ; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1045 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1046 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
1047 ; CHECK-NEXT: call void @llvm.donothing()
1048 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1049 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 -1
1050 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 0
1051 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 0
1052 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1053 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1055 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1056 ; CHECK-NEXT: unreachable
1058 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1059 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1060 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1061 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2
1062 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
1063 ; CHECK-NEXT: ret void
1065 %ptr = getelementptr i16, ptr %D, i64 -1
1066 %tmp = extractelement <4 x i16> %A, i32 0
1067 store i16 %tmp, ptr %ptr
1071 define void @st1lane_ro_4h(<4 x i16> %A, ptr %D, i64 %offset) sanitize_memory {
1072 ; CHECK-LABEL: define void @st1lane_ro_4h(
1073 ; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1074 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1075 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1076 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
1077 ; CHECK-NEXT: call void @llvm.donothing()
1078 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1079 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]
1080 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP3]], i32 1
1081 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 1
1082 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1083 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1085 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1086 ; CHECK-NEXT: unreachable
1088 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1089 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1090 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1091 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2
1092 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
1093 ; CHECK-NEXT: ret void
1095 %ptr = getelementptr i16, ptr %D, i64 %offset
1096 %tmp = extractelement <4 x i16> %A, i32 1
1097 store i16 %tmp, ptr %ptr
1101 define void @st1lane0_ro_4h(<4 x i16> %A, ptr %D, i64 %offset) sanitize_memory {
1102 ; CHECK-LABEL: define void @st1lane0_ro_4h(
1103 ; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1104 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1105 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1106 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
1107 ; CHECK-NEXT: call void @llvm.donothing()
1108 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1109 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]
1110 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP3]], i32 0
1111 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 0
1112 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1113 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1115 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1116 ; CHECK-NEXT: unreachable
1118 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1119 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1120 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1121 ; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2
1122 ; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2
1123 ; CHECK-NEXT: ret void
1125 %ptr = getelementptr i16, ptr %D, i64 %offset
1126 %tmp = extractelement <4 x i16> %A, i32 0
1127 store i16 %tmp, ptr %ptr
1131 define void @st1lane_2s(<2 x i32> %A, ptr %D) sanitize_memory {
1132 ; CHECK-LABEL: define void @st1lane_2s(
1133 ; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1134 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1135 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1136 ; CHECK-NEXT: call void @llvm.donothing()
1137 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1138 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1
1139 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 1
1140 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 1
1141 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1142 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1144 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1145 ; CHECK-NEXT: unreachable
1147 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1148 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1149 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1150 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1151 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
1152 ; CHECK-NEXT: ret void
1154 %ptr = getelementptr i32, ptr %D, i64 1
1155 %tmp = extractelement <2 x i32> %A, i32 1
1156 store i32 %tmp, ptr %ptr
1160 define void @st1lane0_2s(<2 x i32> %A, ptr %D) sanitize_memory {
1161 ; CHECK-LABEL: define void @st1lane0_2s(
1162 ; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1163 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1164 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1165 ; CHECK-NEXT: call void @llvm.donothing()
1166 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1167 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1
1168 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0
1169 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 0
1170 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1171 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1173 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1174 ; CHECK-NEXT: unreachable
1176 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1177 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1178 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1179 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1180 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
1181 ; CHECK-NEXT: ret void
1183 %ptr = getelementptr i32, ptr %D, i64 1
1184 %tmp = extractelement <2 x i32> %A, i32 0
1185 store i32 %tmp, ptr %ptr
1189 define void @st1lane0u_2s(<2 x i32> %A, ptr %D) sanitize_memory {
1190 ; CHECK-LABEL: define void @st1lane0u_2s(
1191 ; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1192 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1193 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1194 ; CHECK-NEXT: call void @llvm.donothing()
1195 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1196 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 -1
1197 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0
1198 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 0
1199 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1200 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1202 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1203 ; CHECK-NEXT: unreachable
1205 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1206 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1207 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1208 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1209 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
1210 ; CHECK-NEXT: ret void
1212 %ptr = getelementptr i32, ptr %D, i64 -1
1213 %tmp = extractelement <2 x i32> %A, i32 0
1214 store i32 %tmp, ptr %ptr
1218 define void @st1lane_ro_2s(<2 x i32> %A, ptr %D, i64 %offset) sanitize_memory {
1219 ; CHECK-LABEL: define void @st1lane_ro_2s(
1220 ; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1221 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1222 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1223 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1224 ; CHECK-NEXT: call void @llvm.donothing()
1225 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1226 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]
1227 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 1
1228 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 1
1229 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1230 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1232 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1233 ; CHECK-NEXT: unreachable
1235 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1236 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1237 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1238 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
1239 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
1240 ; CHECK-NEXT: ret void
1242 %ptr = getelementptr i32, ptr %D, i64 %offset
1243 %tmp = extractelement <2 x i32> %A, i32 1
1244 store i32 %tmp, ptr %ptr
1248 define void @st1lane0_ro_2s(<2 x i32> %A, ptr %D, i64 %offset) sanitize_memory {
1249 ; CHECK-LABEL: define void @st1lane0_ro_2s(
1250 ; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1251 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1252 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1253 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1254 ; CHECK-NEXT: call void @llvm.donothing()
1255 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1256 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]
1257 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 0
1258 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 0
1259 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1260 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1262 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1263 ; CHECK-NEXT: unreachable
1265 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1266 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1267 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1268 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
1269 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4
1270 ; CHECK-NEXT: ret void
1272 %ptr = getelementptr i32, ptr %D, i64 %offset
1273 %tmp = extractelement <2 x i32> %A, i32 0
1274 store i32 %tmp, ptr %ptr
1278 define void @st1lane_2s_float(<2 x float> %A, ptr %D) sanitize_memory {
1279 ; CHECK-LABEL: define void @st1lane_2s_float(
1280 ; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1281 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1282 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1283 ; CHECK-NEXT: call void @llvm.donothing()
1284 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1285 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1
1286 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 1
1287 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 1
1288 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1289 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1291 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1292 ; CHECK-NEXT: unreachable
1294 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1295 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1296 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1297 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1298 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
1299 ; CHECK-NEXT: ret void
1301 %ptr = getelementptr float, ptr %D, i64 1
1302 %tmp = extractelement <2 x float> %A, i32 1
1303 store float %tmp, ptr %ptr
1307 define void @st1lane0_2s_float(<2 x float> %A, ptr %D) sanitize_memory {
1308 ; CHECK-LABEL: define void @st1lane0_2s_float(
1309 ; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1310 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1311 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1312 ; CHECK-NEXT: call void @llvm.donothing()
1313 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1314 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1
1315 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0
1316 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 0
1317 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1318 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1320 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1321 ; CHECK-NEXT: unreachable
1323 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1324 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1325 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1326 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1327 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
1328 ; CHECK-NEXT: ret void
1330 %ptr = getelementptr float, ptr %D, i64 1
1331 %tmp = extractelement <2 x float> %A, i32 0
1332 store float %tmp, ptr %ptr
1336 define void @st1lane0u_2s_float(<2 x float> %A, ptr %D) sanitize_memory {
1337 ; CHECK-LABEL: define void @st1lane0u_2s_float(
1338 ; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1339 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1340 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1341 ; CHECK-NEXT: call void @llvm.donothing()
1342 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1343 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 -1
1344 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0
1345 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 0
1346 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1347 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1349 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1350 ; CHECK-NEXT: unreachable
1352 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1353 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1354 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1355 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4
1356 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
1357 ; CHECK-NEXT: ret void
1359 %ptr = getelementptr float, ptr %D, i64 -1
1360 %tmp = extractelement <2 x float> %A, i32 0
1361 store float %tmp, ptr %ptr
1365 define void @st1lane_ro_2s_float(<2 x float> %A, ptr %D, i64 %offset) sanitize_memory {
1366 ; CHECK-LABEL: define void @st1lane_ro_2s_float(
1367 ; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1368 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1369 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1370 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1371 ; CHECK-NEXT: call void @llvm.donothing()
1372 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1373 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]
1374 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 1
1375 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 1
1376 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1377 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1379 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1380 ; CHECK-NEXT: unreachable
1382 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1383 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1384 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1385 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
1386 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
1387 ; CHECK-NEXT: ret void
1389 %ptr = getelementptr float, ptr %D, i64 %offset
1390 %tmp = extractelement <2 x float> %A, i32 1
1391 store float %tmp, ptr %ptr
1395 define void @st1lane0_ro_2s_float(<2 x float> %A, ptr %D, i64 %offset) sanitize_memory {
1396 ; CHECK-LABEL: define void @st1lane0_ro_2s_float(
1397 ; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1398 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1399 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1400 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
1401 ; CHECK-NEXT: call void @llvm.donothing()
1402 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1403 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]
1404 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 0
1405 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 0
1406 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1407 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1409 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1410 ; CHECK-NEXT: unreachable
1412 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1413 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1414 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1415 ; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4
1416 ; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4
1417 ; CHECK-NEXT: ret void
1419 %ptr = getelementptr float, ptr %D, i64 %offset
1420 %tmp = extractelement <2 x float> %A, i32 0
1421 store float %tmp, ptr %ptr
1425 define void @st1lane0_1d(<1 x i64> %A, ptr %D) sanitize_memory {
1426 ; CHECK-LABEL: define void @st1lane0_1d(
1427 ; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1428 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1429 ; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1430 ; CHECK-NEXT: call void @llvm.donothing()
1431 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1432 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 1
1433 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 0
1434 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 0
1435 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1436 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1438 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1439 ; CHECK-NEXT: unreachable
1441 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1442 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1443 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1444 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
1445 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
1446 ; CHECK-NEXT: ret void
1448 %ptr = getelementptr i64, ptr %D, i64 1
1449 %tmp = extractelement <1 x i64> %A, i32 0
1450 store i64 %tmp, ptr %ptr
1454 define void @st1lane0u_1d(<1 x i64> %A, ptr %D) sanitize_memory {
1455 ; CHECK-LABEL: define void @st1lane0u_1d(
1456 ; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1457 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1458 ; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1459 ; CHECK-NEXT: call void @llvm.donothing()
1460 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1461 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 -1
1462 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 0
1463 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 0
1464 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1465 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1467 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1468 ; CHECK-NEXT: unreachable
1470 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1471 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1472 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1473 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
1474 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
1475 ; CHECK-NEXT: ret void
1477 %ptr = getelementptr i64, ptr %D, i64 -1
1478 %tmp = extractelement <1 x i64> %A, i32 0
1479 store i64 %tmp, ptr %ptr
1483 define void @st1lane0_ro_1d(<1 x i64> %A, ptr %D, i64 %offset) sanitize_memory {
1484 ; CHECK-LABEL: define void @st1lane0_ro_1d(
1485 ; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1486 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1487 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1488 ; CHECK-NEXT: [[TMP3:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1489 ; CHECK-NEXT: call void @llvm.donothing()
1490 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1491 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]
1492 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP3]], i32 0
1493 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 0
1494 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1495 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1497 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1498 ; CHECK-NEXT: unreachable
1500 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1501 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1502 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1503 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
1504 ; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8
1505 ; CHECK-NEXT: ret void
1507 %ptr = getelementptr i64, ptr %D, i64 %offset
1508 %tmp = extractelement <1 x i64> %A, i32 0
1509 store i64 %tmp, ptr %ptr
1513 define void @st1lane0_1d_double(<1 x double> %A, ptr %D) sanitize_memory {
1514 ; CHECK-LABEL: define void @st1lane0_1d_double(
1515 ; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1516 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1517 ; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1518 ; CHECK-NEXT: call void @llvm.donothing()
1519 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1520 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 1
1521 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 0
1522 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 0
1523 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1524 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1526 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1527 ; CHECK-NEXT: unreachable
1529 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1530 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1531 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1532 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
1533 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
1534 ; CHECK-NEXT: ret void
1536 %ptr = getelementptr double, ptr %D, i64 1
1537 %tmp = extractelement <1 x double> %A, i32 0
1538 store double %tmp, ptr %ptr
1542 define void @st1lane0u_1d_double(<1 x double> %A, ptr %D) sanitize_memory {
1543 ; CHECK-LABEL: define void @st1lane0u_1d_double(
1544 ; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1545 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1546 ; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1547 ; CHECK-NEXT: call void @llvm.donothing()
1548 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0
1549 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 -1
1550 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 0
1551 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 0
1552 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1553 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
1555 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1556 ; CHECK-NEXT: unreachable
1558 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64
1559 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1560 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1561 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8
1562 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
1563 ; CHECK-NEXT: ret void
1565 %ptr = getelementptr double, ptr %D, i64 -1
1566 %tmp = extractelement <1 x double> %A, i32 0
1567 store double %tmp, ptr %ptr
1571 define void @st1lane0_ro_1d_double(<1 x double> %A, ptr %D, i64 %offset) sanitize_memory {
1572 ; CHECK-LABEL: define void @st1lane0_ro_1d_double(
1573 ; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {
1574 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
1575 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1576 ; CHECK-NEXT: [[TMP3:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 8
1577 ; CHECK-NEXT: call void @llvm.donothing()
1578 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]
1579 ; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]
1580 ; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP3]], i32 0
1581 ; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 0
1582 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0
1583 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF0]]
1585 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1586 ; CHECK-NEXT: unreachable
1588 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
1589 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1590 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1591 ; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8
1592 ; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8
1593 ; CHECK-NEXT: ret void
1595 %ptr = getelementptr double, ptr %D, i64 %offset
1596 %tmp = extractelement <1 x double> %A, i32 0
1597 store double %tmp, ptr %ptr
1601 define void @st2lane_16b(<16 x i8> %A, <16 x i8> %B, ptr %D) sanitize_memory {
1602 ; CHECK-LABEL: define void @st2lane_16b(
1603 ; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1604 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1605 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
1606 ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1607 ; CHECK-NEXT: call void @llvm.donothing()
1608 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i64
1609 ; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 193514046488576
1610 ; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr
1611 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], i64 1, ptr [[TMP6]])
1612 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1613 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0]]
1615 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1616 ; CHECK-NEXT: unreachable
1618 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], i64 1, ptr [[D]])
1619 ; CHECK-NEXT: ret void
1621 call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, i64 1, ptr %D)
1625 define void @st2lane_8h(<8 x i16> %A, <8 x i16> %B, ptr %D) sanitize_memory {
1626 ; CHECK-LABEL: define void @st2lane_8h(
1627 ; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1628 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1629 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
1630 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1631 ; CHECK-NEXT: call void @llvm.donothing()
1632 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i64
1633 ; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 193514046488576
1634 ; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr
1635 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], i64 1, ptr [[TMP6]])
1636 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1637 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0]]
1639 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1640 ; CHECK-NEXT: unreachable
1642 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], i64 1, ptr [[D]])
1643 ; CHECK-NEXT: ret void
1645 call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, i64 1, ptr %D)
1649 define void @st2lane_4s(<4 x i32> %A, <4 x i32> %B, ptr %D) sanitize_memory {
1650 ; CHECK-LABEL: define void @st2lane_4s(
1651 ; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1652 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1653 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
1654 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1655 ; CHECK-NEXT: call void @llvm.donothing()
1656 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i64
1657 ; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 193514046488576
1658 ; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr
1659 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], i64 1, ptr [[TMP6]])
1660 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1661 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0]]
1663 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1664 ; CHECK-NEXT: unreachable
1666 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], i64 1, ptr [[D]])
1667 ; CHECK-NEXT: ret void
1669 call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, i64 1, ptr %D)
1673 define void @st2lane_2d(<2 x i64> %A, <2 x i64> %B, ptr %D) sanitize_memory {
1674 ; CHECK-LABEL: define void @st2lane_2d(
1675 ; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1676 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1677 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
1678 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1679 ; CHECK-NEXT: call void @llvm.donothing()
1680 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i64
1681 ; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 193514046488576
1682 ; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr
1683 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], i64 1, ptr [[TMP6]])
1684 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1685 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0]]
1687 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1688 ; CHECK-NEXT: unreachable
1690 ; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], i64 1, ptr [[D]])
1691 ; CHECK-NEXT: ret void
1693 call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, i64 1, ptr %D)
1697 declare void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readnone
1698 declare void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readnone
1699 declare void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readnone
1700 declare void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readnone
1702 define void @st3lane_16b(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, ptr %D) sanitize_memory {
1703 ; CHECK-LABEL: define void @st3lane_16b(
1704 ; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <16 x i8> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1705 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1706 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
1707 ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1708 ; CHECK-NEXT: [[TMP4:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1709 ; CHECK-NEXT: call void @llvm.donothing()
1710 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i64
1711 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1712 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1713 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], <16 x i8> [[TMP4]], i64 1, ptr [[TMP7]])
1714 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1715 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]]
1717 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1718 ; CHECK-NEXT: unreachable
1720 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], <16 x i8> [[C]], i64 1, ptr [[D]])
1721 ; CHECK-NEXT: ret void
1723 call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, i64 1, ptr %D)
1727 define void @st3lane_8h(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, ptr %D) sanitize_memory {
1728 ; CHECK-LABEL: define void @st3lane_8h(
1729 ; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i16> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1730 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1731 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
1732 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1733 ; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1734 ; CHECK-NEXT: call void @llvm.donothing()
1735 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i64
1736 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1737 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1738 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], i64 1, ptr [[TMP7]])
1739 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1740 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]]
1742 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1743 ; CHECK-NEXT: unreachable
1745 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], <8 x i16> [[C]], i64 1, ptr [[D]])
1746 ; CHECK-NEXT: ret void
1748 call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, i64 1, ptr %D)
1752 define void @st3lane_4s(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, ptr %D) sanitize_memory {
1753 ; CHECK-LABEL: define void @st3lane_4s(
1754 ; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1755 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1756 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
1757 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1758 ; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1759 ; CHECK-NEXT: call void @llvm.donothing()
1760 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i64
1761 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1762 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1763 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], i64 1, ptr [[TMP7]])
1764 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1765 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]]
1767 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1768 ; CHECK-NEXT: unreachable
1770 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> [[C]], i64 1, ptr [[D]])
1771 ; CHECK-NEXT: ret void
1773 call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, i64 1, ptr %D)
1777 define void @st3lane_2d(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, ptr %D) sanitize_memory {
1778 ; CHECK-LABEL: define void @st3lane_2d(
1779 ; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], <2 x i64> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
1780 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1781 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
1782 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1783 ; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1784 ; CHECK-NEXT: call void @llvm.donothing()
1785 ; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i64
1786 ; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576
1787 ; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr
1788 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], i64 1, ptr [[TMP7]])
1789 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1790 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]]
1792 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1793 ; CHECK-NEXT: unreachable
1795 ; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], <2 x i64> [[C]], i64 1, ptr [[D]])
1796 ; CHECK-NEXT: ret void
1798 call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, i64 1, ptr %D)
1802 declare void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readnone
1803 declare void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readnone
1804 declare void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readnone
1805 declare void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readnone
1807 define void @st4lane_16b(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %E) sanitize_memory {
1808 ; CHECK-LABEL: define void @st4lane_16b(
1809 ; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <16 x i8> [[C:%.*]], <16 x i8> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {
1810 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 64) to ptr), align 8
1811 ; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
1812 ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1813 ; CHECK-NEXT: [[TMP4:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1814 ; CHECK-NEXT: [[TMP5:%.*]] = load <16 x i8>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1815 ; CHECK-NEXT: call void @llvm.donothing()
1816 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i64
1817 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1818 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1819 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], <16 x i8> [[TMP4]], <16 x i8> [[TMP5]], i64 1, ptr [[TMP8]])
1820 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1821 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF0]]
1823 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1824 ; CHECK-NEXT: unreachable
1826 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], <16 x i8> [[C]], <16 x i8> [[D]], i64 1, ptr [[E]])
1827 ; CHECK-NEXT: ret void
1829 call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 1, ptr %E)
1833 define void @st4lane_8h(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %E) sanitize_memory {
1834 ; CHECK-LABEL: define void @st4lane_8h(
1835 ; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i16> [[C:%.*]], <8 x i16> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {
1836 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 64) to ptr), align 8
1837 ; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
1838 ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1839 ; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1840 ; CHECK-NEXT: [[TMP5:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1841 ; CHECK-NEXT: call void @llvm.donothing()
1842 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i64
1843 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1844 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1845 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], <8 x i16> [[TMP5]], i64 1, ptr [[TMP8]])
1846 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1847 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF0]]
1849 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1850 ; CHECK-NEXT: unreachable
1852 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], <8 x i16> [[C]], <8 x i16> [[D]], i64 1, ptr [[E]])
1853 ; CHECK-NEXT: ret void
1855 call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 1, ptr %E)
1859 define void @st4lane_4s(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %E) sanitize_memory {
1860 ; CHECK-LABEL: define void @st4lane_4s(
1861 ; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> [[C:%.*]], <4 x i32> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {
1862 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 64) to ptr), align 8
1863 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
1864 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1865 ; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1866 ; CHECK-NEXT: [[TMP5:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1867 ; CHECK-NEXT: call void @llvm.donothing()
1868 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i64
1869 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1870 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1871 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> [[TMP5]], i64 1, ptr [[TMP8]])
1872 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1873 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF0]]
1875 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1876 ; CHECK-NEXT: unreachable
1878 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> [[C]], <4 x i32> [[D]], i64 1, ptr [[E]])
1879 ; CHECK-NEXT: ret void
1881 call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 1, ptr %E)
1885 define void @st4lane_2d(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %E) sanitize_memory {
1886 ; CHECK-LABEL: define void @st4lane_2d(
1887 ; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], <2 x i64> [[C:%.*]], <2 x i64> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {
1888 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 64) to ptr), align 8
1889 ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
1890 ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
1891 ; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8
1892 ; CHECK-NEXT: [[TMP5:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 48) to ptr), align 8
1893 ; CHECK-NEXT: call void @llvm.donothing()
1894 ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i64
1895 ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
1896 ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
1897 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]], i64 1, ptr [[TMP8]])
1898 ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
1899 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF0]]
1901 ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
1902 ; CHECK-NEXT: unreachable
1904 ; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], <2 x i64> [[C]], <2 x i64> [[D]], i64 1, ptr [[E]])
1905 ; CHECK-NEXT: ret void
1907 call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 1, ptr %E)
1911 declare void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readnone
1912 declare void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readnone
1913 declare void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readnone
1914 declare void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readnone
1916 ; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 1048575}