xref: /llvm-project/llvm/test/Transforms/LoopIdiom/memmove-tbaa.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
18cb9c736SWilliam S. Moses; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28cb9c736SWilliam S. Moses; RUN: opt -passes="loop-idiom" < %s -S | FileCheck %s
38cb9c736SWilliam S. Moses
4*055fb779SNikita Popovdefine void @looper(ptr nocapture %out) {
58cb9c736SWilliam S. Moses; CHECK-LABEL: @looper(
68cb9c736SWilliam S. Moses; CHECK-NEXT:  entry:
7*055fb779SNikita Popov; CHECK-NEXT:    [[M:%.*]] = getelementptr double, ptr [[OUT:%.*]], i32 16
8*055fb779SNikita Popov; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr align 8 [[OUT]], ptr align 8 [[M]], i64 256, i1 false), !tbaa [[TBAA0:![0-9]+]]
9260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY4:%.*]]
10260679b0SDávid Bolvanský; CHECK:       for.body4:
11260679b0SDávid Bolvanský; CHECK-NEXT:    [[J_020:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY4]] ]
12*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[M]], i64 [[J_020]]
13*055fb779SNikita Popov; CHECK-NEXT:    [[A0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA0]]
14*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, ptr [[OUT]], i64 [[J_020]]
15260679b0SDávid Bolvanský; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[J_020]], 1
16260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[J_020]], 31
17260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_BODY4]], label [[FOR_COND_CLEANUP:%.*]]
18260679b0SDávid Bolvanský; CHECK:       for.cond.cleanup:
19260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
208cb9c736SWilliam S. Moses;
218cb9c736SWilliam S. Mosesentry:
22*055fb779SNikita Popov  %M = getelementptr double, ptr %out, i32 16
238cb9c736SWilliam S. Moses  br label %for.body4
248cb9c736SWilliam S. Moses
258cb9c736SWilliam S. Mosesfor.body4:                                        ; preds = %for.cond1.preheader, %for.body4
268cb9c736SWilliam S. Moses  %j.020 = phi i64 [ 0, %entry ], [ %inc, %for.body4 ]
27*055fb779SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %M, i64 %j.020
28*055fb779SNikita Popov  %a0 = load double, ptr %arrayidx, align 8, !tbaa !5
29*055fb779SNikita Popov  %arrayidx8 = getelementptr inbounds double, ptr %out, i64 %j.020
30*055fb779SNikita Popov  store double %a0, ptr %arrayidx8, align 8, !tbaa !5
318cb9c736SWilliam S. Moses  %inc = add nuw nsw i64 %j.020, 1
328cb9c736SWilliam S. Moses  %cmp2 = icmp ult i64 %j.020, 31
338cb9c736SWilliam S. Moses  br i1 %cmp2, label %for.body4, label %for.cond.cleanup
348cb9c736SWilliam S. Moses
358cb9c736SWilliam S. Mosesfor.cond.cleanup:                                 ; preds = %for.cond.cleanup3
368cb9c736SWilliam S. Moses  ret void
378cb9c736SWilliam S. Moses}
388cb9c736SWilliam S. Moses
398cb9c736SWilliam S. Moses
40*055fb779SNikita Popovdefine void @looperBadMerge(ptr nocapture %out) {
418cb9c736SWilliam S. Moses; CHECK-LABEL: @looperBadMerge(
428cb9c736SWilliam S. Moses; CHECK-NEXT:  entry:
43*055fb779SNikita Popov; CHECK-NEXT:    [[M:%.*]] = getelementptr double, ptr [[OUT:%.*]], i32 16
44*055fb779SNikita Popov; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr align 8 [[OUT]], ptr align 8 [[M]], i64 256, i1 false), !tbaa [[TBAA4:![0-9]+]]
458cb9c736SWilliam S. Moses; CHECK-NEXT:    br label [[FOR_BODY4:%.*]]
46260679b0SDávid Bolvanský; CHECK:       for.body4:
47260679b0SDávid Bolvanský; CHECK-NEXT:    [[J_020:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY4]] ]
48*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[M]], i64 [[J_020]]
49*055fb779SNikita Popov; CHECK-NEXT:    [[A0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA0]]
50*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, ptr [[OUT]], i64 [[J_020]]
51260679b0SDávid Bolvanský; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[J_020]], 1
52260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[J_020]], 31
53260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_BODY4]], label [[FOR_COND_CLEANUP:%.*]]
54260679b0SDávid Bolvanský; CHECK:       for.cond.cleanup:
55260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
568cb9c736SWilliam S. Moses;
578cb9c736SWilliam S. Mosesentry:
58*055fb779SNikita Popov  %M = getelementptr double, ptr %out, i32 16
598cb9c736SWilliam S. Moses  br label %for.body4
608cb9c736SWilliam S. Moses
618cb9c736SWilliam S. Mosesfor.body4:                                        ; preds = %for.cond1.preheader, %for.body4
628cb9c736SWilliam S. Moses  %j.020 = phi i64 [ 0, %entry ], [ %inc, %for.body4 ]
63*055fb779SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %M, i64 %j.020
64*055fb779SNikita Popov  %a0 = load double, ptr %arrayidx, align 8, !tbaa !5
65*055fb779SNikita Popov  %arrayidx8 = getelementptr inbounds double, ptr %out, i64 %j.020
66*055fb779SNikita Popov  store double %a0, ptr %arrayidx8, align 8, !tbaa !3
678cb9c736SWilliam S. Moses  %inc = add nuw nsw i64 %j.020, 1
688cb9c736SWilliam S. Moses  %cmp2 = icmp ult i64 %j.020, 31
698cb9c736SWilliam S. Moses  br i1 %cmp2, label %for.body4, label %for.cond.cleanup
708cb9c736SWilliam S. Moses
718cb9c736SWilliam S. Mosesfor.cond.cleanup:                                 ; preds = %for.cond.cleanup3
728cb9c736SWilliam S. Moses  ret void
738cb9c736SWilliam S. Moses}
748cb9c736SWilliam S. Moses
75*055fb779SNikita Popovdefine void @looperGoodMerge(ptr nocapture %out) {
768cb9c736SWilliam S. Moses; CHECK-LABEL: @looperGoodMerge(
778cb9c736SWilliam S. Moses; CHECK-NEXT:  entry:
78*055fb779SNikita Popov; CHECK-NEXT:    [[M:%.*]] = getelementptr double, ptr [[OUT:%.*]], i32 16
79*055fb779SNikita Popov; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr align 8 [[OUT]], ptr align 8 [[M]], i64 256, i1 false)
808cb9c736SWilliam S. Moses; CHECK-NEXT:    br label [[FOR_BODY4:%.*]]
81260679b0SDávid Bolvanský; CHECK:       for.body4:
82260679b0SDávid Bolvanský; CHECK-NEXT:    [[J_020:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY4]] ]
83*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[M]], i64 [[J_020]]
84*055fb779SNikita Popov; CHECK-NEXT:    [[A0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA0]]
85*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, ptr [[OUT]], i64 [[J_020]]
86260679b0SDávid Bolvanský; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[J_020]], 1
87260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[J_020]], 31
88260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_BODY4]], label [[FOR_COND_CLEANUP:%.*]]
89260679b0SDávid Bolvanský; CHECK:       for.cond.cleanup:
90260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
918cb9c736SWilliam S. Moses;
928cb9c736SWilliam S. Mosesentry:
93*055fb779SNikita Popov  %M = getelementptr double, ptr %out, i32 16
948cb9c736SWilliam S. Moses  br label %for.body4
958cb9c736SWilliam S. Moses
968cb9c736SWilliam S. Mosesfor.body4:                                        ; preds = %for.cond1.preheader, %for.body4
978cb9c736SWilliam S. Moses  %j.020 = phi i64 [ 0, %entry ], [ %inc, %for.body4 ]
98*055fb779SNikita Popov  %arrayidx = getelementptr inbounds double, ptr %M, i64 %j.020
99*055fb779SNikita Popov  %a0 = load double, ptr %arrayidx, align 8, !tbaa !5
100*055fb779SNikita Popov  %arrayidx8 = getelementptr inbounds double, ptr %out, i64 %j.020
101*055fb779SNikita Popov  store double %a0, ptr %arrayidx8, align 8
1028cb9c736SWilliam S. Moses  %inc = add nuw nsw i64 %j.020, 1
1038cb9c736SWilliam S. Moses  %cmp2 = icmp ult i64 %j.020, 31
1048cb9c736SWilliam S. Moses  br i1 %cmp2, label %for.body4, label %for.cond.cleanup
1058cb9c736SWilliam S. Moses
1068cb9c736SWilliam S. Mosesfor.cond.cleanup:                                 ; preds = %for.cond.cleanup3
1078cb9c736SWilliam S. Moses  ret void
1088cb9c736SWilliam S. Moses}
1098cb9c736SWilliam S. Moses
1108cb9c736SWilliam S. Moses
1118cb9c736SWilliam S. Moses!3 = !{!4, !4, i64 0}
1128cb9c736SWilliam S. Moses!4 = !{!"float", !7, i64 0}
1138cb9c736SWilliam S. Moses!5 = !{!6, !6, i64 0}
1148cb9c736SWilliam S. Moses!6 = !{!"double", !7, i64 0}
1158cb9c736SWilliam S. Moses!7 = !{!"omnipotent char", !8, i64 0}
1168cb9c736SWilliam S. Moses!8 = !{!"Simple C++ TBAA"}
117