xref: /llvm-project/llvm/test/Transforms/LoopIdiom/memset-pattern-tbaa.ll (revision 3eb6fefb9721a2b4513163f4baf53d45e9665d75)
1*3eb6fefbSWilliam S. Moses; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*3eb6fefbSWilliam S. Moses; RUN: opt -passes="loop-idiom" < %s -S | FileCheck %s
3*3eb6fefbSWilliam S. Moses
4*3eb6fefbSWilliam S. Mosestarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5*3eb6fefbSWilliam S. Moses
6*3eb6fefbSWilliam S. Mosestarget triple = "x86_64-apple-darwin10.0.0"
7*3eb6fefbSWilliam S. Moses
8*3eb6fefbSWilliam S. Moses
9*3eb6fefbSWilliam S. Mosesdefine dso_local void @double_memset(ptr nocapture %p) {
10*3eb6fefbSWilliam S. Moses; CHECK-LABEL: @double_memset(
11*3eb6fefbSWilliam S. Moses; CHECK-NEXT:  entry:
12*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern, i64 128), !tbaa [[TBAA0:![0-9]+]]
13*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
14*3eb6fefbSWilliam S. Moses; CHECK:       for.cond.cleanup:
15*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    ret void
16*3eb6fefbSWilliam S. Moses; CHECK:       for.body:
17*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
18*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]]
19*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_07]], 1
20*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], 16
21*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
22*3eb6fefbSWilliam S. Moses;
23*3eb6fefbSWilliam S. Mosesentry:
24*3eb6fefbSWilliam S. Moses  br label %for.body
25*3eb6fefbSWilliam S. Moses
26*3eb6fefbSWilliam S. Mosesfor.cond.cleanup:
27*3eb6fefbSWilliam S. Moses  ret void
28*3eb6fefbSWilliam S. Moses
29*3eb6fefbSWilliam S. Mosesfor.body:
30*3eb6fefbSWilliam S. Moses  %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ]
31*3eb6fefbSWilliam S. Moses  %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07
32*3eb6fefbSWilliam S. Moses  store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !5
33*3eb6fefbSWilliam S. Moses  %inc = add nuw nsw i64 %i.07, 1
34*3eb6fefbSWilliam S. Moses  %exitcond.not = icmp eq i64 %inc, 16
35*3eb6fefbSWilliam S. Moses  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
36*3eb6fefbSWilliam S. Moses}
37*3eb6fefbSWilliam S. Moses
38*3eb6fefbSWilliam S. Moses
39*3eb6fefbSWilliam S. Mosesdefine dso_local void @struct_memset(ptr nocapture %p) {
40*3eb6fefbSWilliam S. Moses; CHECK-LABEL: @struct_memset(
41*3eb6fefbSWilliam S. Moses; CHECK-NEXT:  entry:
42*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern.1, i64 128), !tbaa [[TBAA4:![0-9]+]]
43*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
44*3eb6fefbSWilliam S. Moses; CHECK:       for.cond.cleanup:
45*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    ret void
46*3eb6fefbSWilliam S. Moses; CHECK:       for.body:
47*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
48*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]]
49*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_07]], 1
50*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], 16
51*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
52*3eb6fefbSWilliam S. Moses;
53*3eb6fefbSWilliam S. Mosesentry:
54*3eb6fefbSWilliam S. Moses  br label %for.body
55*3eb6fefbSWilliam S. Moses
56*3eb6fefbSWilliam S. Mosesfor.cond.cleanup:
57*3eb6fefbSWilliam S. Moses  ret void
58*3eb6fefbSWilliam S. Moses
59*3eb6fefbSWilliam S. Mosesfor.body:
60*3eb6fefbSWilliam S. Moses  %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ]
61*3eb6fefbSWilliam S. Moses  %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07
62*3eb6fefbSWilliam S. Moses  store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !10
63*3eb6fefbSWilliam S. Moses  %inc = add nuw nsw i64 %i.07, 1
64*3eb6fefbSWilliam S. Moses  %exitcond.not = icmp eq i64 %inc, 16
65*3eb6fefbSWilliam S. Moses  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
66*3eb6fefbSWilliam S. Moses}
67*3eb6fefbSWilliam S. Moses
68*3eb6fefbSWilliam S. Mosesdefine dso_local void @var_memset(ptr nocapture %p, i64 %len) {
69*3eb6fefbSWilliam S. Moses; CHECK-LABEL: @var_memset(
70*3eb6fefbSWilliam S. Moses; CHECK-NEXT:  entry:
71*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[TMP0:%.*]] = shl nuw i64 [[LEN:%.*]], 3
72*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern.2, i64 [[TMP0]])
73*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
74*3eb6fefbSWilliam S. Moses; CHECK:       for.cond.cleanup:
75*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    ret void
76*3eb6fefbSWilliam S. Moses; CHECK:       for.body:
77*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
78*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]]
79*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_07]], 1
80*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], [[LEN]]
81*3eb6fefbSWilliam S. Moses; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
82*3eb6fefbSWilliam S. Moses;
83*3eb6fefbSWilliam S. Mosesentry:
84*3eb6fefbSWilliam S. Moses  br label %for.body
85*3eb6fefbSWilliam S. Moses
86*3eb6fefbSWilliam S. Mosesfor.cond.cleanup:
87*3eb6fefbSWilliam S. Moses  ret void
88*3eb6fefbSWilliam S. Moses
89*3eb6fefbSWilliam S. Mosesfor.body:
90*3eb6fefbSWilliam S. Moses  %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ]
91*3eb6fefbSWilliam S. Moses  %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07
92*3eb6fefbSWilliam S. Moses  store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !10
93*3eb6fefbSWilliam S. Moses  %inc = add nuw nsw i64 %i.07, 1
94*3eb6fefbSWilliam S. Moses  %exitcond.not = icmp eq i64 %inc, %len
95*3eb6fefbSWilliam S. Moses  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
96*3eb6fefbSWilliam S. Moses}
97*3eb6fefbSWilliam S. Moses
98*3eb6fefbSWilliam S. Moses!5 = !{!6, !6, i64 0}
99*3eb6fefbSWilliam S. Moses!6 = !{!"double", !7, i64 0}
100*3eb6fefbSWilliam S. Moses!7 = !{!"omnipotent char", !8, i64 0}
101*3eb6fefbSWilliam S. Moses!8 = !{!"Simple C++ TBAA"}
102*3eb6fefbSWilliam S. Moses
103*3eb6fefbSWilliam S. Moses!15 = !{!8, i64 0, !"omnipotent char"}
104*3eb6fefbSWilliam S. Moses!17 = !{!15, i64 8, !"double"}
105*3eb6fefbSWilliam S. Moses!9 = !{!15, i64 32, !"_ZTS1A", !17, i64 0, i64 8, !17, i64 8, i64 8, !17, i64 16, i64 8, !17, i64 24, i64 8}
106*3eb6fefbSWilliam S. Moses!10 = !{!9, !17, i64 0, i64 1}
107*3eb6fefbSWilliam S. Moses
108*3eb6fefbSWilliam S. Moses!18 = !{!19, !20, i64 0}
109*3eb6fefbSWilliam S. Moses!19 = !{!"A", !20, i64 0, !22, i64 8}
110*3eb6fefbSWilliam S. Moses!20 = !{!"any pointer", !7, i64 0}
111*3eb6fefbSWilliam S. Moses!21 = !{!22, !20, i64 0}
112*3eb6fefbSWilliam S. Moses!22 = !{!"B", !20, i64 0}
113