]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/MemCpyOpt/load-store-to-memcpy.ll
Vendor import of llvm trunk r338150:
[FreeBSD/FreeBSD.git] / test / Transforms / MemCpyOpt / load-store-to-memcpy.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -basicaa -scoped-noalias -memcpyopt -S %s | FileCheck %s
3
4 %T = type { i8, i32 }
5
6 ; Ensure load-store forwarding of an aggregate is interpreted as
7 ; a memmove when the source and dest may alias
8 define void @test_memmove(%T* align 8 %a, %T* align 16 %b) {
9 ; CHECK-LABEL: @test_memmove(
10 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast %T* [[B:%.*]] to i8*
11 ; CHECK-NEXT:    [[TMP2:%.*]] = bitcast %T* [[A:%.*]] to i8*
12 ; CHECK-NEXT:    call void @llvm.memmove.p0i8.p0i8.i64(i8* align 16 [[TMP1]], i8* align 8 [[TMP2]], i64 8, i1 false)
13 ; CHECK-NEXT:    ret void
14 ;
15   %val = load %T, %T* %a, align 8
16   store %T %val, %T* %b, align 16
17   ret void
18 }
19
20 ; Ensure load-store forwarding of an aggregate is interpreted as
21 ; a memcpy when the source and dest do not alias
22 define void @test_memcpy(%T* noalias align 8 %a, %T* noalias align 16 %b) {
23 ; CHECK-LABEL: @test_memcpy(
24 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast %T* [[B:%.*]] to i8*
25 ; CHECK-NEXT:    [[TMP2:%.*]] = bitcast %T* [[A:%.*]] to i8*
26 ; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[TMP1]], i8* align 8 [[TMP2]], i64 8, i1 false)
27 ; CHECK-NEXT:    ret void
28 ;
29   %val = load %T, %T* %a, align 8
30   store %T %val, %T* %b, align 16
31   ret void
32 }
33
34 ; memcpy(%d, %a) should not be generated since store2 may-aliases load %a.
35 define void @f(%T* %a, %T* %b, %T* %c, %T* %d) {
36 ; CHECK-LABEL: @f(
37 ; CHECK-NEXT:    [[VAL:%.*]] = load %T, %T* %a, !alias.scope !0
38 ; CHECK-NEXT:    store %T { i8 23, i32 23 }, %T* %b, !alias.scope !3
39 ; CHECK-NEXT:    store %T { i8 44, i32 44 }, %T* %c, !alias.scope !6, !noalias !3
40 ; CHECK-NEXT:    store %T [[VAL]], %T* %d, !alias.scope !9, !noalias !12
41 ; CHECK-NEXT:    ret void
42 ;
43   %val = load %T, %T* %a, !alias.scope !{!10}
44
45   ; store1 may-aliases the load
46   store %T { i8 23, i32 23 }, %T* %b, !alias.scope !{!11}
47
48   ; store2 may-aliases the load and store3
49   store %T { i8 44, i32 44 }, %T* %c, !alias.scope !{!12}, !noalias !{!11}
50
51   ; store3
52   store %T %val, %T* %d, !alias.scope !{!13}, !noalias !{!10, !11}
53   ret void
54 }
55
56 !0 = !{!0}
57 !1 = !{!1}
58 !2 = !{!2}
59 !3 = !{!3}
60
61 !10 = !{ !10, !0 }
62 !11 = !{ !11, !1 }
63 !12 = !{ !12, !2 }
64 !13 = !{ !13, !3 }