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