1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -basic-aa -memcpyopt -dse -S -enable-memcpyopt-memoryssa=0 | FileCheck %s
3; RUN: opt < %s -basic-aa -memcpyopt -dse -S -enable-memcpyopt-memoryssa=1 -verify-memoryssa | FileCheck %s
4
5target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
6target triple = "i686-apple-darwin9"
7
8%0 = type { x86_fp80, x86_fp80 }
9%1 = type { i32, i32 }
10
11define void @test1(%0* sret(%0)  %agg.result, x86_fp80 %z.0, x86_fp80 %z.1) nounwind  {
12; CHECK-LABEL: @test1(
13; CHECK-NEXT:  entry:
14; CHECK-NEXT:    [[TMP2:%.*]] = alloca [[TMP0:%.*]], align 16
15; CHECK-NEXT:    [[MEMTMP:%.*]] = alloca [[TMP0]], align 16
16; CHECK-NEXT:    [[TMP5:%.*]] = fsub x86_fp80 0xK80000000000000000000, [[Z_1:%.*]]
17; CHECK-NEXT:    call void @ccoshl(%0* sret([[TMP0]]) [[TMP2]], x86_fp80 [[TMP5]], x86_fp80 [[Z_0:%.*]]) #[[ATTR0:[0-9]+]]
18; CHECK-NEXT:    [[TMP219:%.*]] = bitcast %0* [[TMP2]] to i8*
19; CHECK-NEXT:    [[MEMTMP20:%.*]] = bitcast %0* [[MEMTMP]] to i8*
20; CHECK-NEXT:    [[AGG_RESULT21:%.*]] = bitcast %0* [[AGG_RESULT:%.*]] to i8*
21; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 [[AGG_RESULT21]], i8* align 16 [[TMP219]], i32 32, i1 false)
22; CHECK-NEXT:    ret void
23;
24entry:
25  %tmp2 = alloca %0
26  %memtmp = alloca %0, align 16
27  %tmp5 = fsub x86_fp80 0xK80000000000000000000, %z.1
28  call void @ccoshl(%0* sret(%0) %memtmp, x86_fp80 %tmp5, x86_fp80 %z.0) nounwind
29  %tmp219 = bitcast %0* %tmp2 to i8*
30  %memtmp20 = bitcast %0* %memtmp to i8*
31  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %tmp219, i8* align 16 %memtmp20, i32 32, i1 false)
32  %agg.result21 = bitcast %0* %agg.result to i8*
33  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %agg.result21, i8* align 16 %tmp219, i32 32, i1 false)
34  ret void
35
36; Check that one of the memcpy's are removed.
37;; FIXME: PR 8643 We should be able to eliminate the last memcpy here.
38
39}
40
41declare void @ccoshl(%0* nocapture sret(%0), x86_fp80, x86_fp80) nounwind
42
43
44; The intermediate alloca and one of the memcpy's should be eliminated, the
45; other should be related with a memmove.
46define void @test2(i8* %P, i8* %Q) nounwind  {
47; CHECK-LABEL: @test2(
48; CHECK-NEXT:    call void @llvm.memmove.p0i8.p0i8.i32(i8* align 16 [[Q:%.*]], i8* align 16 [[P:%.*]], i32 32, i1 false)
49; CHECK-NEXT:    ret void
50;
51  %memtmp = alloca %0, align 16
52  %R = bitcast %0* %memtmp to i8*
53  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %R, i8* align 16 %P, i32 32, i1 false)
54  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %Q, i8* align 16 %R, i32 32, i1 false)
55  ret void
56
57}
58
59; The intermediate alloca and one of the memcpy's should be eliminated, the
60; other should be related with a memcpy.
61define void @test2_memcpy(i8* noalias %P, i8* noalias %Q) nounwind  {
62; CHECK-LABEL: @test2_memcpy(
63; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 [[Q:%.*]], i8* align 16 [[P:%.*]], i32 32, i1 false)
64; CHECK-NEXT:    ret void
65;
66  %memtmp = alloca %0, align 16
67  %R = bitcast %0* %memtmp to i8*
68  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %R, i8* align 16 %P, i32 32, i1 false)
69  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %Q, i8* align 16 %R, i32 32, i1 false)
70  ret void
71
72}
73
74
75
76
77@x = external global %0
78
79define void @test3(%0* noalias sret(%0) %agg.result) nounwind  {
80; CHECK-LABEL: @test3(
81; CHECK-NEXT:    [[X_0:%.*]] = alloca [[TMP0:%.*]], align 16
82; CHECK-NEXT:    [[X_01:%.*]] = bitcast %0* [[X_0]] to i8*
83; CHECK-NEXT:    [[AGG_RESULT1:%.*]] = bitcast %0* [[AGG_RESULT:%.*]] to i8*
84; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 [[AGG_RESULT1]], i8* align 16 bitcast (%0* @x to i8*), i32 32, i1 false)
85; CHECK-NEXT:    [[AGG_RESULT2:%.*]] = bitcast %0* [[AGG_RESULT]] to i8*
86; CHECK-NEXT:    ret void
87;
88  %x.0 = alloca %0
89  %x.01 = bitcast %0* %x.0 to i8*
90  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %x.01, i8* align 16 bitcast (%0* @x to i8*), i32 32, i1 false)
91  %agg.result2 = bitcast %0* %agg.result to i8*
92  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %agg.result2, i8* align 16 %x.01, i32 32, i1 false)
93  ret void
94}
95
96
97; PR8644
98define void @test4(i8 *%P) {
99; CHECK-LABEL: @test4(
100; CHECK-NEXT:    call void @test4a(i8* byval(i8) align 1 [[P:%.*]])
101; CHECK-NEXT:    ret void
102;
103  %A = alloca %1
104  %a = bitcast %1* %A to i8*
105  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a, i8* align 4 %P, i64 8, i1 false)
106  call void @test4a(i8* align 1 byval(i8) %a)
107  ret void
108}
109
110; Make sure we don't remove the memcpy if the source address space doesn't match the byval argument
111define void @test4_addrspace(i8 addrspace(1)* %P) {
112; CHECK-LABEL: @test4_addrspace(
113; CHECK-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
114; CHECK-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
115; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p1i8.i64(i8* align 4 [[A2]], i8 addrspace(1)* align 4 [[P:%.*]], i64 8, i1 false)
116; CHECK-NEXT:    call void @test4a(i8* byval(i8) align 1 [[A2]])
117; CHECK-NEXT:    ret void
118;
119  %a1 = alloca %1
120  %a2 = bitcast %1* %a1 to i8*
121  call void @llvm.memcpy.p0i8.p1i8.i64(i8* align 4 %a2, i8 addrspace(1)* align 4 %P, i64 8, i1 false)
122  call void @test4a(i8* align 1 byval(i8) %a2)
123  ret void
124}
125
126define void @test4_write_between(i8 *%P) {
127; CHECK-LABEL: @test4_write_between(
128; CHECK-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
129; CHECK-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
130; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[A2]], i8* align 4 [[P:%.*]], i64 8, i1 false)
131; CHECK-NEXT:    store i8 0, i8* [[A2]], align 1
132; CHECK-NEXT:    call void @test4a(i8* byval(i8) align 1 [[A2]])
133; CHECK-NEXT:    ret void
134;
135  %a1 = alloca %1
136  %a2 = bitcast %1* %a1 to i8*
137  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a2, i8* align 4 %P, i64 8, i1 false)
138  store i8 0, i8* %a2
139  call void @test4a(i8* align 1 byval(i8) %a2)
140  ret void
141}
142
143define i8 @test4_read_between(i8 *%P) {
144; NO_MSSA-LABEL: @test4_read_between(
145; NO_MSSA-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
146; NO_MSSA-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
147; NO_MSSA-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[A2]], i8* align 4 [[P:%.*]], i64 8, i1 false)
148; NO_MSSA-NEXT:    [[X:%.*]] = load i8, i8* [[A2]], align 1
149; NO_MSSA-NEXT:    call void @test4a(i8* byval align 1 [[A2]])
150; NO_MSSA-NEXT:    ret i8 [[X]]
151;
152; MSSA-LABEL: @test4_read_between(
153; MSSA-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
154; MSSA-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
155; MSSA-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[A2]], i8* align 4 [[P:%.*]], i64 8, i1 false)
156; MSSA-NEXT:    [[X:%.*]] = load i8, i8* [[A2]], align 1
157; MSSA-NEXT:    call void @test4a(i8* byval align 1 [[P]])
158; MSSA-NEXT:    ret i8 [[X]]
159;
160  %a1 = alloca %1
161  %a2 = bitcast %1* %a1 to i8*
162  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a2, i8* align 4 %P, i64 8, i1 false)
163  %x = load i8, i8* %a2
164  call void @test4a(i8* align 1 byval(i8) %a2)
165  ret i8 %x
166}
167
168define void @test4_non_local(i8 *%P, i1 %c) {
169; NO_MSSA-LABEL: @test4_non_local(
170; NO_MSSA-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
171; NO_MSSA-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
172; NO_MSSA-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[A2]], i8* align 4 [[P:%.*]], i64 8, i1 false)
173; NO_MSSA-NEXT:    br i1 [[C:%.*]], label [[CALL:%.*]], label [[EXIT:%.*]]
174; NO_MSSA:       call:
175; NO_MSSA-NEXT:    call void @test4a(i8* byval align 1 [[A2]])
176; NO_MSSA-NEXT:    br label [[EXIT]]
177; NO_MSSA:       exit:
178; NO_MSSA-NEXT:    ret void
179;
180; MSSA-LABEL: @test4_non_local(
181; MSSA-NEXT:    [[A1:%.*]] = alloca [[TMP1:%.*]], align 8
182; MSSA-NEXT:    [[A2:%.*]] = bitcast %1* [[A1]] to i8*
183; MSSA-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[A2]], i8* align 4 [[P:%.*]], i64 8, i1 false)
184; MSSA-NEXT:    br i1 [[C:%.*]], label [[CALL:%.*]], label [[EXIT:%.*]]
185; MSSA:       call:
186; MSSA-NEXT:    call void @test4a(i8* byval align 1 [[P]])
187; MSSA-NEXT:    br label [[EXIT]]
188; MSSA:       exit:
189; MSSA-NEXT:    ret void
190;
191  %a1 = alloca %1
192  %a2 = bitcast %1* %a1 to i8*
193  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a2, i8* align 4 %P, i64 8, i1 false)
194  br i1 %c, label %call, label %exit
195
196call:
197  call void @test4a(i8* align 1 byval(i8) %a2)
198  br label %exit
199
200exit:
201  ret void
202}
203
204declare void @test4a(i8* align 1 byval(i8))
205declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
206declare void @llvm.memcpy.p0i8.p1i8.i64(i8* nocapture, i8 addrspace(1)* nocapture, i64, i1) nounwind
207declare void @llvm.memcpy.p1i8.p1i8.i64(i8 addrspace(1)* nocapture, i8 addrspace(1)* nocapture, i64, i1) nounwind
208
209%struct.S = type { i128, [4 x i8]}
210
211@sS = external global %struct.S, align 16
212
213declare void @test5a(%struct.S* align 16 byval(%struct.S)) nounwind ssp
214
215
216; rdar://8713376 - This memcpy can't be eliminated.
217define i32 @test5(i32 %x) nounwind ssp {
218; CHECK-LABEL: @test5(
219; CHECK-NEXT:  entry:
220; CHECK-NEXT:    [[Y:%.*]] = alloca [[STRUCT_S:%.*]], align 16
221; CHECK-NEXT:    [[TMP:%.*]] = bitcast %struct.S* [[Y]] to i8*
222; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[TMP]], i8* align 16 bitcast (%struct.S* @sS to i8*), i64 32, i1 false)
223; CHECK-NEXT:    [[A:%.*]] = getelementptr [[STRUCT_S]], %struct.S* [[Y]], i64 0, i32 1, i64 0
224; CHECK-NEXT:    store i8 4, i8* [[A]], align 1
225; CHECK-NEXT:    call void @test5a(%struct.S* byval([[STRUCT_S]]) align 16 [[Y]])
226; CHECK-NEXT:    ret i32 0
227;
228entry:
229  %y = alloca %struct.S, align 16
230  %tmp = bitcast %struct.S* %y to i8*
231  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %tmp, i8* align 16 bitcast (%struct.S* @sS to i8*), i64 32, i1 false)
232  %a = getelementptr %struct.S, %struct.S* %y, i64 0, i32 1, i64 0
233  store i8 4, i8* %a
234  call void @test5a(%struct.S* align 16 byval(%struct.S) %y)
235  ret i32 0
236}
237
238;; Noop memcpy should be zapped.
239define void @test6(i8 *%P) {
240; CHECK-LABEL: @test6(
241; CHECK-NEXT:    ret void
242;
243  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %P, i8* align 4 %P, i64 8, i1 false)
244  ret void
245}
246
247
248; PR9794 - Should forward memcpy into byval argument even though the memcpy
249; isn't itself 8 byte aligned.
250%struct.p = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
251
252define i32 @test7(%struct.p* nocapture align 8 byval(%struct.p) %q) nounwind ssp {
253; CHECK-LABEL: @test7(
254; CHECK-NEXT:  entry:
255; CHECK-NEXT:    [[CALL:%.*]] = call i32 @g(%struct.p* byval([[STRUCT_P:%.*]]) align 8 [[Q:%.*]]) #[[ATTR0]]
256; CHECK-NEXT:    ret i32 [[CALL]]
257;
258entry:
259  %agg.tmp = alloca %struct.p, align 4
260  %tmp = bitcast %struct.p* %agg.tmp to i8*
261  %tmp1 = bitcast %struct.p* %q to i8*
262  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %tmp, i8* align 4 %tmp1, i64 48, i1 false)
263  %call = call i32 @g(%struct.p* align 8 byval(%struct.p) %agg.tmp) nounwind
264  ret i32 %call
265}
266
267declare i32 @g(%struct.p* align 8 byval(%struct.p))
268
269declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
270
271; PR11142 - When looking for a memcpy-memcpy dependency, don't get stuck on
272; instructions between the memcpy's that only affect the destination pointer.
273@test8.str = internal constant [7 x i8] c"ABCDEF\00"
274
275define void @test8() {
276; CHECK-LABEL: @test8(
277; CHECK-NEXT:    ret void
278;
279  %A = tail call i8* @malloc(i32 10)
280  %B = getelementptr inbounds i8, i8* %A, i64 2
281  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %B, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @test8.str, i64 0, i64 0), i32 7, i1 false)
282  %C = tail call i8* @malloc(i32 10)
283  %D = getelementptr inbounds i8, i8* %C, i64 2
284  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %D, i8* %B, i32 7, i1 false)
285  ret void
286}
287
288declare noalias i8* @malloc(i32) willreturn
289
290; rdar://11341081
291%struct.big = type { [50 x i32] }
292
293define void @test9_addrspacecast() nounwind ssp uwtable {
294; CHECK-LABEL: @test9_addrspacecast(
295; CHECK-NEXT:  entry:
296; CHECK-NEXT:    [[B:%.*]] = alloca [[STRUCT_BIG:%.*]], align 4
297; CHECK-NEXT:    [[TMP:%.*]] = alloca [[STRUCT_BIG]], align 4
298; CHECK-NEXT:    call void @f1(%struct.big* sret([[STRUCT_BIG]]) [[B]])
299; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast %struct.big* [[B]] to i8 addrspace(1)*
300; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast %struct.big* [[TMP]] to i8 addrspace(1)*
301; CHECK-NEXT:    call void @f2(%struct.big* [[B]])
302; CHECK-NEXT:    ret void
303;
304entry:
305  %b = alloca %struct.big, align 4
306  %tmp = alloca %struct.big, align 4
307  call void @f1(%struct.big* sret(%struct.big) %tmp)
308  %0 = addrspacecast %struct.big* %b to i8 addrspace(1)*
309  %1 = addrspacecast %struct.big* %tmp to i8 addrspace(1)*
310  call void @llvm.memcpy.p1i8.p1i8.i64(i8 addrspace(1)* align 4 %0, i8 addrspace(1)* align 4 %1, i64 200, i1 false)
311  call void @f2(%struct.big* %b)
312  ret void
313}
314
315define void @test9() nounwind ssp uwtable {
316; CHECK-LABEL: @test9(
317; CHECK-NEXT:  entry:
318; CHECK-NEXT:    [[B:%.*]] = alloca [[STRUCT_BIG:%.*]], align 4
319; CHECK-NEXT:    [[TMP:%.*]] = alloca [[STRUCT_BIG]], align 4
320; CHECK-NEXT:    call void @f1(%struct.big* sret([[STRUCT_BIG]]) [[B]])
321; CHECK-NEXT:    [[TMP0:%.*]] = bitcast %struct.big* [[B]] to i8*
322; CHECK-NEXT:    [[TMP1:%.*]] = bitcast %struct.big* [[TMP]] to i8*
323; CHECK-NEXT:    call void @f2(%struct.big* [[B]])
324; CHECK-NEXT:    ret void
325;
326entry:
327  %b = alloca %struct.big, align 4
328  %tmp = alloca %struct.big, align 4
329  call void @f1(%struct.big* sret(%struct.big) %tmp)
330  %0 = bitcast %struct.big* %b to i8*
331  %1 = bitcast %struct.big* %tmp to i8*
332  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 200, i1 false)
333  call void @f2(%struct.big* %b)
334  ret void
335}
336
337; rdar://14073661.
338; Test10 triggered assertion when the compiler try to get the size of the
339; opaque type of *x, where the x is the formal argument with attribute 'sret'.
340
341%opaque = type opaque
342declare void @foo(i32* noalias nocapture)
343
344define void @test10(%opaque* noalias nocapture sret(%opaque) %x, i32 %y) {
345; CHECK-LABEL: @test10(
346; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
347; CHECK-NEXT:    store i32 [[Y:%.*]], i32* [[A]], align 4
348; CHECK-NEXT:    call void @foo(i32* noalias nocapture [[A]])
349; CHECK-NEXT:    [[C:%.*]] = load i32, i32* [[A]], align 4
350; CHECK-NEXT:    [[D:%.*]] = bitcast %opaque* [[X:%.*]] to i32*
351; CHECK-NEXT:    store i32 [[C]], i32* [[D]], align 4
352; CHECK-NEXT:    ret void
353;
354  %a = alloca i32, align 4
355  store i32 %y, i32* %a
356  call void @foo(i32* noalias nocapture %a)
357  %c = load i32, i32* %a
358  %d = bitcast %opaque* %x to i32*
359  store i32 %c, i32* %d
360  ret void
361}
362
363; don't create new addressspacecasts when we don't know they're safe for the target
364define void @test11([20 x i32] addrspace(1)* nocapture dereferenceable(80) %P) {
365; CHECK-LABEL: @test11(
366; CHECK-NEXT:    [[B:%.*]] = bitcast [20 x i32] addrspace(1)* [[P:%.*]] to i8 addrspace(1)*
367; CHECK-NEXT:    call void @llvm.memset.p1i8.i64(i8 addrspace(1)* align 4 [[B]], i8 0, i64 80, i1 false)
368; CHECK-NEXT:    ret void
369;
370  %A = alloca [20 x i32], align 4
371  %a = bitcast [20 x i32]* %A to i8*
372  %b = bitcast [20 x i32] addrspace(1)* %P to i8 addrspace(1)*
373  call void @llvm.memset.p0i8.i64(i8* align 4 %a, i8 0, i64 80, i1 false)
374  call void @llvm.memcpy.p1i8.p0i8.i64(i8 addrspace(1)* align 4 %b, i8* align 4 %a, i64 80, i1 false)
375  ret void
376}
377
378declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
379declare void @llvm.memcpy.p1i8.p0i8.i64(i8 addrspace(1)* nocapture, i8* nocapture, i64, i1) nounwind
380
381declare void @f1(%struct.big* nocapture sret(%struct.big))
382declare void @f2(%struct.big*)
383
384; CHECK: attributes #1 = { argmemonly nofree nosync nounwind willreturn }
385; CHECK: attributes #2 = { nounwind ssp }
386; CHECK: attributes #3 = { willreturn }
387; CHECK: attributes #4 = { nounwind ssp uwtable }
388; CHECK: attributes #5 = { argmemonly nofree nosync nounwind willreturn writeonly }
389