[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / Transforms / MemCpyOpt / callslot_badaa.ll
blobefdbdce401b762fd15ad8ac57a93c3b69c44fef9
1 ; RUN: opt < %s -S -passes=memcpyopt | FileCheck --match-full-lines %s
3 ; Make sure callslot optimization merges alias.scope metadata correctly when it merges instructions.
4 ; Merging here naively generates:
5 ;  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %src, i64 1, i1 false), !alias.scope !3
6 ;  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src), !noalias !0
7 ;   ...
8 ;  !0 = !{!1}
9 ;  !1 = distinct !{!1, !2, !"callee1: %a"}
10 ;  !2 = distinct !{!2, !"callee1"}
11 ;  !3 = !{!1, !4}
12 ;  !4 = distinct !{!4, !5, !"callee0: %a"}
13 ;  !5 = distinct !{!5, !"callee0"}
14 ; Which is incorrect because the lifetime.end of %src will now "noalias" the above memcpy.
15 define i8 @test(i8 %input) {
16   %tmp = alloca i8
17   %dst = alloca i8
18   %src = alloca i8
19 ; NOTE: we're matching the full line and looking for the lack of !alias.scope here
20 ; CHECK:   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %src, i64 1, i1 false)
21   call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %src), !noalias !3
22   store i8 %input, ptr %src
23   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %tmp, ptr align 8 %src, i64 1, i1 false), !alias.scope !0
24   call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src), !noalias !3
25   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %tmp, i64 1, i1 false), !alias.scope !3
26   %ret_value = load i8, ptr %dst
27   ret i8 %ret_value
30 declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
31 declare void @llvm.lifetime.end.p0(i64, ptr nocapture)
32 declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
34 !0 = !{!1}
35 !1 = distinct !{!1, !2, !"callee0: %a"}
36 !2 = distinct !{!2, !"callee0"}
37 !3 = !{!4}
38 !4 = distinct !{!4, !5, !"callee1: %a"}
39 !5 = distinct !{!5, !"callee1"}