xref: /llvm-project/llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll (revision d1314d0152f242c618caafce264fccbc47273d84)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=dse -S %s | FileCheck %s
3
4define void @memset_equal_size_values(ptr %ptr, i64 %len) {
5; CHECK-LABEL: @memset_equal_size_values(
6; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
7; CHECK-NEXT:    ret void
8;
9  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
10  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
11  ret void
12}
13
14define void @memset_different_size_values_1(ptr %ptr, i64 %len.1, i64 %len.2) {
15; CHECK-LABEL: @memset_different_size_values_1(
16; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
17; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN_2:%.*]], i1 false)
18; CHECK-NEXT:    ret void
19;
20  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len.1, i1 false)
21  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len.2, i1 false)
22  ret void
23}
24
25define void @memset_different_size_values_2(ptr %ptr, i64 %len) {
26; CHECK-LABEL: @memset_different_size_values_2(
27; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
28; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR]], i8 0, i64 100, i1 false)
29; CHECK-NEXT:    ret void
30;
31  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
32  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 100, i1 false)
33  ret void
34}
35
36define void @memset_different_size_values_3(ptr %ptr, i64 %len) {
37; CHECK-LABEL: @memset_different_size_values_3(
38; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 100, i1 false)
39; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN:%.*]], i1 false)
40; CHECK-NEXT:    ret void
41;
42  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 100, i1 false)
43  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
44  ret void
45}
46
47define void @memset_and_store_1(ptr %ptr, i64 %len) {
48; CHECK-LABEL: @memset_and_store_1(
49; CHECK-NEXT:    store i64 123, ptr [[PTR:%.*]], align 4
50; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN:%.*]], i1 false)
51; CHECK-NEXT:    ret void
52;
53  store i64 123, ptr %ptr
54  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
55  ret void
56}
57
58define void @memset_and_store_2(ptr %ptr, i64 %len) {
59; CHECK-LABEL: @memset_and_store_2(
60; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
61; CHECK-NEXT:    store i64 123, ptr [[PTR]], align 4
62; CHECK-NEXT:    ret void
63;
64  call void @llvm.memset.p0.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
65  store i64 123, ptr %ptr
66  ret void
67}
68
69define void @memset_pattern_equal_size_values(ptr %ptr, i64 %len) {
70; CHECK-LABEL: @memset_pattern_equal_size_values(
71; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
72; CHECK-NEXT:    ret void
73;
74  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
75  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
76  ret void
77}
78
79define void @memset_pattern_different_size_values_1(ptr %ptr, i64 %len.1, i64 %len.2) {
80; CHECK-LABEL: @memset_pattern_different_size_values_1(
81; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
82; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN_2:%.*]], i1 false)
83; CHECK-NEXT:    ret void
84;
85  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len.1, i1 false)
86  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len.2, i1 false)
87  ret void
88}
89
90define void @memset_pattern_different_size_values_2(ptr %ptr, i64 %len) {
91; CHECK-LABEL: @memset_pattern_different_size_values_2(
92; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
93; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 100, i1 false)
94; CHECK-NEXT:    ret void
95;
96  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
97  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 100, i1 false)
98  ret void
99}
100
101define void @memset_pattern_different_size_values_3(ptr %ptr, i64 %len) {
102; CHECK-LABEL: @memset_pattern_different_size_values_3(
103; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 100, i1 false)
104; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN:%.*]], i1 false)
105; CHECK-NEXT:    ret void
106;
107  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 100, i1 false)
108  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
109  ret void
110}
111
112define void @memset_pattern_and_store_1(ptr %ptr, i64 %len) {
113; CHECK-LABEL: @memset_pattern_and_store_1(
114; CHECK-NEXT:    store i64 123, ptr [[PTR:%.*]], align 4
115; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 [[LEN:%.*]], i1 false)
116; CHECK-NEXT:    ret void
117;
118  store i64 123, ptr %ptr
119  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
120  ret void
121}
122
123define void @memset_pattern_and_store_2(ptr %ptr, i64 %len) {
124; CHECK-LABEL: @memset_pattern_and_store_2(
125; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
126; CHECK-NEXT:    store i64 123, ptr [[PTR]], align 4
127; CHECK-NEXT:    ret void
128;
129  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 %len, i1 false)
130  store i64 123, ptr %ptr
131  ret void
132}
133
134define void @memset_pattern_and_store_3(ptr %ptr) {
135; CHECK-LABEL: @memset_pattern_and_store_3(
136; CHECK-NEXT:    call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 13, i1 false)
137; CHECK-NEXT:    ret void
138;
139  store i64 0, ptr %ptr
140  call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 %ptr, i8 0, i64 13, i1 false)
141  ret void
142}
143
144define void @memcpy_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
145; CHECK-LABEL: @memcpy_equal_size_values(
146; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
147; CHECK-NEXT:    ret void
148;
149  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
150  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
151  ret void
152}
153
154define void @memcpy_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
155; CHECK-LABEL: @memcpy_different_size_values_1(
156; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
157; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[LEN_2:%.*]], i1 false)
158; CHECK-NEXT:    ret void
159;
160  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
161  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.2, i1 false)
162  ret void
163}
164
165define void @memcpy_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len) {
166; CHECK-LABEL: @memcpy_different_size_values_2(
167; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
168; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 100, i1 false)
169; CHECK-NEXT:    ret void
170;
171  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
172  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
173  ret void
174}
175
176define void @memcpy_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len) {
177; CHECK-LABEL: @memcpy_different_size_values_3(
178; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 100, i1 false)
179; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[LEN:%.*]], i1 false)
180; CHECK-NEXT:    ret void
181;
182  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
183  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
184  ret void
185}
186
187define void @memset_and_memcpy_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
188; CHECK-LABEL: @memset_and_memcpy_equal_size_values(
189; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
190; CHECK-NEXT:    ret void
191;
192  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len, i1 false)
193  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
194  ret void
195}
196
197define void @memset_and_memcpy_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
198; CHECK-LABEL: @memset_and_memcpy_different_size_values_1(
199; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
200; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 [[LEN_2:%.*]], i1 false)
201; CHECK-NEXT:    ret void
202;
203  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
204  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.2, i1 false)
205  ret void
206}
207
208define void @memset_and_memcpy_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
209; CHECK-LABEL: @memset_and_memcpy_different_size_values_2(
210; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
211; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 100, i1 false)
212; CHECK-NEXT:    ret void
213;
214  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
215  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
216  ret void
217}
218
219define void @memset_and_memcpy_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
220; CHECK-LABEL: @memset_and_memcpy_different_size_values_3(
221; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 100, i1 false)
222; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
223; CHECK-NEXT:    ret void
224;
225  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 100, i1 false)
226  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
227  ret void
228}
229
230define void @memcpy_and_memset_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
231; CHECK-LABEL: @memcpy_and_memset_equal_size_values(
232; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
233; CHECK-NEXT:    ret void
234;
235  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
236  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len, i1 false)
237  ret void
238}
239
240define void @memcpy_and_memset_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
241; CHECK-LABEL: @memcpy_and_memset_different_size_values_1(
242; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
243; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[LEN_2:%.*]], i1 false)
244; CHECK-NEXT:    ret void
245;
246  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
247  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.2, i1 false)
248  ret void
249}
250
251define void @memcpy_and_memset_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
252; CHECK-LABEL: @memcpy_and_memset_different_size_values_2(
253; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
254; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 100, i1 false)
255; CHECK-NEXT:    ret void
256;
257  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
258  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 100, i1 false)
259  ret void
260}
261
262define void @memcpy_and_memset_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
263; CHECK-LABEL: @memcpy_and_memset_different_size_values_3(
264; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 100, i1 false)
265; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[LEN_1:%.*]], i1 false)
266; CHECK-NEXT:    ret void
267;
268  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
269  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
270  ret void
271}
272
273define void @memmove_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
274; CHECK-LABEL: @memmove_equal_size_values(
275; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
276; CHECK-NEXT:    ret void
277;
278  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
279  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
280  ret void
281}
282
283define void @memmove_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
284; CHECK-LABEL: @memmove_different_size_values_1(
285; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
286; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[LEN_2:%.*]], i1 false)
287; CHECK-NEXT:    ret void
288;
289  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
290  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.2, i1 false)
291  ret void
292}
293
294define void @memmove_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len) {
295; CHECK-LABEL: @memmove_different_size_values_2(
296; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
297; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 100, i1 false)
298; CHECK-NEXT:    ret void
299;
300  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
301  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
302  ret void
303}
304
305define void @memmove_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len) {
306; CHECK-LABEL: @memmove_different_size_values_3(
307; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 100, i1 false)
308; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[LEN:%.*]], i1 false)
309; CHECK-NEXT:    ret void
310;
311  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
312  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
313  ret void
314}
315
316define void @memset_and_memmove_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
317; CHECK-LABEL: @memset_and_memmove_equal_size_values(
318; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
319; CHECK-NEXT:    ret void
320;
321  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len, i1 false)
322  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
323  ret void
324}
325
326define void @memset_and_memmove_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
327; CHECK-LABEL: @memset_and_memmove_different_size_values_1(
328; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
329; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 [[LEN_2:%.*]], i1 false)
330; CHECK-NEXT:    ret void
331;
332  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
333  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.2, i1 false)
334  ret void
335}
336
337define void @memset_and_memmove_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
338; CHECK-LABEL: @memset_and_memmove_different_size_values_2(
339; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN_1:%.*]], i1 false)
340; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 100, i1 false)
341; CHECK-NEXT:    ret void
342;
343  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
344  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
345  ret void
346}
347
348define void @memset_and_memmove_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
349; CHECK-LABEL: @memset_and_memmove_different_size_values_3(
350; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 100, i1 false)
351; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
352; CHECK-NEXT:    ret void
353;
354  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 100, i1 false)
355  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
356  ret void
357}
358
359define void @memmove_and_memset_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
360; CHECK-LABEL: @memmove_and_memset_equal_size_values(
361; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST:%.*]], i8 0, i64 [[LEN:%.*]], i1 false)
362; CHECK-NEXT:    ret void
363;
364  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
365  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len, i1 false)
366  ret void
367}
368
369define void @memmove_and_memset_different_size_values_1(ptr noalias %src, ptr noalias %dst, i64 %len.1, i64 %len.2) {
370; CHECK-LABEL: @memmove_and_memset_different_size_values_1(
371; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
372; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[LEN_2:%.*]], i1 false)
373; CHECK-NEXT:    ret void
374;
375  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
376  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.2, i1 false)
377  ret void
378}
379
380define void @memmove_and_memset_different_size_values_2(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
381; CHECK-LABEL: @memmove_and_memset_different_size_values_2(
382; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN_1:%.*]], i1 false)
383; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 100, i1 false)
384; CHECK-NEXT:    ret void
385;
386  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len.1, i1 false)
387  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 100, i1 false)
388  ret void
389}
390
391define void @memmove_and_memset_different_size_values_3(ptr noalias %src, ptr noalias %dst, i64 %len.1) {
392; CHECK-LABEL: @memmove_and_memset_different_size_values_3(
393; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 100, i1 false)
394; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[LEN_1:%.*]], i1 false)
395; CHECK-NEXT:    ret void
396;
397  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 100, i1 false)
398  call void @llvm.memset.p0.i64(ptr align 1 %dst, i8 0, i64 %len.1, i1 false)
399  ret void
400}
401
402define void @memmove_and_memcpy_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
403; CHECK-LABEL: @memmove_and_memcpy_equal_size_values(
404; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
405; CHECK-NEXT:    ret void
406;
407  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
408  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
409  ret void
410}
411
412define void @memcpy_and_memmove_equal_size_values(ptr noalias %src, ptr noalias %dst, i64 %len) {
413; CHECK-LABEL: @memcpy_and_memmove_equal_size_values(
414; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[LEN:%.*]], i1 false)
415; CHECK-NEXT:    ret void
416;
417  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
418  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 false)
419  ret void
420}
421
422declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
423declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
424declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
425