[memprof] Move YAML traits to MemProf.h (NFC) (#118668)
[llvm-project.git] / llvm / test / Instrumentation / MemorySanitizer / AArch64 / neon_vst_lane.ll
blob9ed364df3e677f8ccced46a7418ad5fd1b3b11f6
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]+]]
25 ; CHECK:       3:
26 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
27 ; CHECK-NEXT:    unreachable
28 ; CHECK:       4:
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
39   ret void
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]]
54 ; CHECK:       3:
55 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
56 ; CHECK-NEXT:    unreachable
57 ; CHECK:       4:
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
68   ret void
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]]
83 ; CHECK:       3:
84 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
85 ; CHECK-NEXT:    unreachable
86 ; CHECK:       4:
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
97   ret void
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]]
113 ; CHECK:       4:
114 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
115 ; CHECK-NEXT:    unreachable
116 ; CHECK:       5:
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
127   ret void
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]]
143 ; CHECK:       4:
144 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
145 ; CHECK-NEXT:    unreachable
146 ; CHECK:       5:
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
157   ret void
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]]
172 ; CHECK:       3:
173 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
174 ; CHECK-NEXT:    unreachable
175 ; CHECK:       4:
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
186   ret void
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]]
201 ; CHECK:       3:
202 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
203 ; CHECK-NEXT:    unreachable
204 ; CHECK:       4:
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
215   ret void
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]]
230 ; CHECK:       3:
231 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
232 ; CHECK-NEXT:    unreachable
233 ; CHECK:       4:
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
244   ret void
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]]
260 ; CHECK:       4:
261 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
262 ; CHECK-NEXT:    unreachable
263 ; CHECK:       5:
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
274   ret void
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]]
290 ; CHECK:       4:
291 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
292 ; CHECK-NEXT:    unreachable
293 ; CHECK:       5:
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
304   ret void
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]]
319 ; CHECK:       3:
320 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
321 ; CHECK-NEXT:    unreachable
322 ; CHECK:       4:
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
333   ret void
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]]
348 ; CHECK:       3:
349 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
350 ; CHECK-NEXT:    unreachable
351 ; CHECK:       4:
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
362   ret void
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]]
377 ; CHECK:       3:
378 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
379 ; CHECK-NEXT:    unreachable
380 ; CHECK:       4:
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
391   ret void
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]]
407 ; CHECK:       4:
408 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
409 ; CHECK-NEXT:    unreachable
410 ; CHECK:       5:
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
421   ret void
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]]
437 ; CHECK:       4:
438 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
439 ; CHECK-NEXT:    unreachable
440 ; CHECK:       5:
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
451   ret void
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]]
466 ; CHECK:       3:
467 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
468 ; CHECK-NEXT:    unreachable
469 ; CHECK:       4:
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
480   ret void
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]]
495 ; CHECK:       3:
496 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
497 ; CHECK-NEXT:    unreachable
498 ; CHECK:       4:
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
509   ret void
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]]
524 ; CHECK:       3:
525 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
526 ; CHECK-NEXT:    unreachable
527 ; CHECK:       4:
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
538   ret void
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]]
554 ; CHECK:       4:
555 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
556 ; CHECK-NEXT:    unreachable
557 ; CHECK:       5:
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
568   ret void
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]]
584 ; CHECK:       4:
585 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
586 ; CHECK-NEXT:    unreachable
587 ; CHECK:       5:
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
598   ret void
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]]
613 ; CHECK:       3:
614 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
615 ; CHECK-NEXT:    unreachable
616 ; CHECK:       4:
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
627   ret void
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]]
642 ; CHECK:       3:
643 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
644 ; CHECK-NEXT:    unreachable
645 ; CHECK:       4:
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
656   ret void
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]]
671 ; CHECK:       3:
672 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
673 ; CHECK-NEXT:    unreachable
674 ; CHECK:       4:
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
685   ret void
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]]
701 ; CHECK:       4:
702 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
703 ; CHECK-NEXT:    unreachable
704 ; CHECK:       5:
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
715   ret void
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]]
731 ; CHECK:       4:
732 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
733 ; CHECK-NEXT:    unreachable
734 ; CHECK:       5:
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
745   ret void
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]]
760 ; CHECK:       3:
761 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
762 ; CHECK-NEXT:    unreachable
763 ; CHECK:       4:
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
774   ret void
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]]
789 ; CHECK:       3:
790 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
791 ; CHECK-NEXT:    unreachable
792 ; CHECK:       4:
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
803   ret void
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]]
818 ; CHECK:       3:
819 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
820 ; CHECK-NEXT:    unreachable
821 ; CHECK:       4:
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
832   ret void
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]]
848 ; CHECK:       4:
849 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
850 ; CHECK-NEXT:    unreachable
851 ; CHECK:       5:
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
862   ret void
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]]
878 ; CHECK:       4:
879 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
880 ; CHECK-NEXT:    unreachable
881 ; CHECK:       5:
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
892   ret void
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]]
907 ; CHECK:       3:
908 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
909 ; CHECK-NEXT:    unreachable
910 ; CHECK:       4:
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
921   ret void
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]]
937 ; CHECK:       4:
938 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
939 ; CHECK-NEXT:    unreachable
940 ; CHECK:       5:
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
951   ret void
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]]
967 ; CHECK:       4:
968 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
969 ; CHECK-NEXT:    unreachable
970 ; CHECK:       5:
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
981   ret void
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]]
996 ; CHECK:       3:
997 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
998 ; CHECK-NEXT:    unreachable
999 ; CHECK:       4:
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
1010   ret void
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]]
1025 ; CHECK:       3:
1026 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1027 ; CHECK-NEXT:    unreachable
1028 ; CHECK:       4:
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
1039   ret void
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]]
1054 ; CHECK:       3:
1055 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1056 ; CHECK-NEXT:    unreachable
1057 ; CHECK:       4:
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
1068   ret void
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]]
1084 ; CHECK:       4:
1085 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1086 ; CHECK-NEXT:    unreachable
1087 ; CHECK:       5:
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
1098   ret void
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]]
1114 ; CHECK:       4:
1115 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1116 ; CHECK-NEXT:    unreachable
1117 ; CHECK:       5:
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
1128   ret void
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]]
1143 ; CHECK:       3:
1144 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1145 ; CHECK-NEXT:    unreachable
1146 ; CHECK:       4:
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
1157   ret void
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]]
1172 ; CHECK:       3:
1173 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1174 ; CHECK-NEXT:    unreachable
1175 ; CHECK:       4:
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
1186   ret void
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]]
1201 ; CHECK:       3:
1202 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1203 ; CHECK-NEXT:    unreachable
1204 ; CHECK:       4:
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
1215   ret void
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]]
1231 ; CHECK:       4:
1232 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1233 ; CHECK-NEXT:    unreachable
1234 ; CHECK:       5:
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
1245   ret void
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]]
1261 ; CHECK:       4:
1262 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1263 ; CHECK-NEXT:    unreachable
1264 ; CHECK:       5:
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
1275   ret void
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]]
1290 ; CHECK:       3:
1291 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1292 ; CHECK-NEXT:    unreachable
1293 ; CHECK:       4:
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
1304   ret void
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]]
1319 ; CHECK:       3:
1320 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1321 ; CHECK-NEXT:    unreachable
1322 ; CHECK:       4:
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
1333   ret void
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]]
1348 ; CHECK:       3:
1349 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1350 ; CHECK-NEXT:    unreachable
1351 ; CHECK:       4:
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
1362   ret void
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]]
1378 ; CHECK:       4:
1379 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1380 ; CHECK-NEXT:    unreachable
1381 ; CHECK:       5:
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
1392   ret void
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]]
1408 ; CHECK:       4:
1409 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1410 ; CHECK-NEXT:    unreachable
1411 ; CHECK:       5:
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
1422   ret void
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]]
1437 ; CHECK:       3:
1438 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1439 ; CHECK-NEXT:    unreachable
1440 ; CHECK:       4:
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
1451   ret void
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]]
1466 ; CHECK:       3:
1467 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1468 ; CHECK-NEXT:    unreachable
1469 ; CHECK:       4:
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
1480   ret void
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]]
1496 ; CHECK:       4:
1497 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1498 ; CHECK-NEXT:    unreachable
1499 ; CHECK:       5:
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
1510   ret void
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]]
1525 ; CHECK:       3:
1526 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1527 ; CHECK-NEXT:    unreachable
1528 ; CHECK:       4:
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
1539   ret void
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]]
1554 ; CHECK:       3:
1555 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1556 ; CHECK-NEXT:    unreachable
1557 ; CHECK:       4:
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
1568   ret void
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]]
1584 ; CHECK:       4:
1585 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1586 ; CHECK-NEXT:    unreachable
1587 ; CHECK:       5:
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
1598   ret void
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]]
1614 ; CHECK:       7:
1615 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1616 ; CHECK-NEXT:    unreachable
1617 ; CHECK:       8:
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)
1622   ret void
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]]
1638 ; CHECK:       7:
1639 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1640 ; CHECK-NEXT:    unreachable
1641 ; CHECK:       8:
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)
1646   ret void
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]]
1662 ; CHECK:       7:
1663 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1664 ; CHECK-NEXT:    unreachable
1665 ; CHECK:       8:
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)
1670   ret void
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]]
1686 ; CHECK:       7:
1687 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1688 ; CHECK-NEXT:    unreachable
1689 ; CHECK:       8:
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)
1694   ret void
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]]
1716 ; CHECK:       8:
1717 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1718 ; CHECK-NEXT:    unreachable
1719 ; CHECK:       9:
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)
1724   ret void
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]]
1741 ; CHECK:       8:
1742 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1743 ; CHECK-NEXT:    unreachable
1744 ; CHECK:       9:
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)
1749   ret void
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]]
1766 ; CHECK:       8:
1767 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1768 ; CHECK-NEXT:    unreachable
1769 ; CHECK:       9:
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)
1774   ret void
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]]
1791 ; CHECK:       8:
1792 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1793 ; CHECK-NEXT:    unreachable
1794 ; CHECK:       9:
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)
1799   ret void
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]]
1822 ; CHECK:       9:
1823 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1824 ; CHECK-NEXT:    unreachable
1825 ; CHECK:       10:
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)
1830   ret void
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]]
1848 ; CHECK:       9:
1849 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1850 ; CHECK-NEXT:    unreachable
1851 ; CHECK:       10:
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)
1856   ret void
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]]
1874 ; CHECK:       9:
1875 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1876 ; CHECK-NEXT:    unreachable
1877 ; CHECK:       10:
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)
1882   ret void
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]]
1900 ; CHECK:       9:
1901 ; CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR4]]
1902 ; CHECK-NEXT:    unreachable
1903 ; CHECK:       10:
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)
1908   ret void
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}