150 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=loop-unroll -unroll-force-peel-count=1 | FileCheck %s3; RUN: opt < %s -S -passes='loop-unroll<peeling;no-runtime>' -unroll-force-peel-count=1 | FileCheck %s4 5target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"6target triple = "x86_64-unknown-linux-gnu"7 8; Loop peeling must result in valid scope declartions9 10define internal fastcc void @test01(ptr %p0, ptr %p1, ptr %p2) unnamed_addr align 2 {11; CHECK-LABEL: @test01(12; CHECK-NEXT: for.body47.lr.ph:13; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !0)14; CHECK-NEXT: br label [[FOR_BODY47_PEEL_BEGIN:%.*]]15; CHECK: for.body47.peel.begin:16; CHECK-NEXT: br label [[FOR_BODY47_PEEL:%.*]]17; CHECK: for.body47.peel:18; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !3)19; CHECK-NEXT: store i8 42, ptr [[P0:%.*]], align 1, !alias.scope !320; CHECK-NEXT: store i8 43, ptr [[P1:%.*]], align 1, !alias.scope !021; CHECK-NEXT: store i8 44, ptr [[P2:%.*]], align 1, !alias.scope !522; CHECK-NEXT: store i8 42, ptr [[P0]], align 1, !noalias !323; CHECK-NEXT: store i8 43, ptr [[P1]], align 1, !noalias !024; CHECK-NEXT: store i8 44, ptr [[P2]], align 1, !noalias !525; CHECK-NEXT: [[CMP52_PEEL:%.*]] = icmp eq i32 0, 026; CHECK-NEXT: br i1 [[CMP52_PEEL]], label [[COND_TRUE_PEEL:%.*]], label [[COND_END_PEEL:%.*]]27; CHECK: cond.true.peel:28; CHECK-NEXT: store i8 52, ptr [[P0]], align 1, !alias.scope !329; CHECK-NEXT: store i8 53, ptr [[P1]], align 1, !alias.scope !030; CHECK-NEXT: store i8 54, ptr [[P2]], align 1, !alias.scope !531; CHECK-NEXT: store i8 52, ptr [[P0]], align 1, !noalias !332; CHECK-NEXT: store i8 53, ptr [[P1]], align 1, !noalias !033; CHECK-NEXT: store i8 54, ptr [[P2]], align 1, !noalias !534; CHECK-NEXT: br label [[COND_END_PEEL]]35; CHECK: cond.end.peel:36; CHECK-NEXT: store i8 62, ptr [[P0]], align 1, !alias.scope !337; CHECK-NEXT: store i8 63, ptr [[P1]], align 1, !alias.scope !038; CHECK-NEXT: store i8 64, ptr [[P2]], align 1, !alias.scope !539; CHECK-NEXT: store i8 62, ptr [[P0]], align 1, !noalias !340; CHECK-NEXT: store i8 63, ptr [[P1]], align 1, !noalias !041; CHECK-NEXT: store i8 64, ptr [[P2]], align 1, !noalias !542; CHECK-NEXT: [[INC_PEEL:%.*]] = add nuw i32 0, 143; CHECK-NEXT: [[EXITCOND_NOT_PEEL:%.*]] = icmp eq i32 [[INC_PEEL]], undef44; CHECK-NEXT: br i1 [[EXITCOND_NOT_PEEL]], label [[FOR_COND_CLEANUP46:%.*]], label [[FOR_BODY47_PEEL_NEXT:%.*]]45; CHECK: for.body47.peel.next:46; CHECK-NEXT: br label [[FOR_BODY47_PEEL_NEXT1:%.*]]47; CHECK: for.body47.peel.next1:48; CHECK-NEXT: br label [[FOR_BODY47_LR_PH_PEEL_NEWPH:%.*]]49; CHECK: for.body47.lr.ph.peel.newph:50; CHECK-NEXT: br label [[FOR_BODY47:%.*]]51; CHECK: for.cond.cleanup46.loopexit:52; CHECK-NEXT: br label [[FOR_COND_CLEANUP46]]53; CHECK: for.cond.cleanup46:54; CHECK-NEXT: ret void55; CHECK: for.body47:56; CHECK-NEXT: [[J_02:%.*]] = phi i32 [ [[INC_PEEL]], [[FOR_BODY47_LR_PH_PEEL_NEWPH]] ], [ [[INC:%.*]], [[COND_END:%.*]] ]57; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !6)58; CHECK-NEXT: store i8 42, ptr [[P0]], align 1, !alias.scope !659; CHECK-NEXT: store i8 43, ptr [[P1]], align 1, !alias.scope !060; CHECK-NEXT: store i8 44, ptr [[P2]], align 1, !alias.scope !861; CHECK-NEXT: store i8 42, ptr [[P0]], align 1, !noalias !662; CHECK-NEXT: store i8 43, ptr [[P1]], align 1, !noalias !063; CHECK-NEXT: store i8 44, ptr [[P2]], align 1, !noalias !864; CHECK-NEXT: br i1 false, label [[COND_TRUE:%.*]], label [[COND_END]]65; CHECK: cond.true:66; CHECK-NEXT: store i8 52, ptr [[P0]], align 1, !alias.scope !667; CHECK-NEXT: store i8 53, ptr [[P1]], align 1, !alias.scope !068; CHECK-NEXT: store i8 54, ptr [[P2]], align 1, !alias.scope !869; CHECK-NEXT: store i8 52, ptr [[P0]], align 1, !noalias !670; CHECK-NEXT: store i8 53, ptr [[P1]], align 1, !noalias !071; CHECK-NEXT: store i8 54, ptr [[P2]], align 1, !noalias !872; CHECK-NEXT: br label [[COND_END]]73; CHECK: cond.end:74; CHECK-NEXT: store i8 62, ptr [[P0]], align 1, !alias.scope !675; CHECK-NEXT: store i8 63, ptr [[P1]], align 1, !alias.scope !076; CHECK-NEXT: store i8 64, ptr [[P2]], align 1, !alias.scope !877; CHECK-NEXT: store i8 62, ptr [[P0]], align 1, !noalias !678; CHECK-NEXT: store i8 63, ptr [[P1]], align 1, !noalias !079; CHECK-NEXT: store i8 64, ptr [[P2]], align 1, !noalias !880; CHECK-NEXT: [[INC]] = add nuw i32 [[J_02]], 181; CHECK-NEXT: br i1 undef, label [[FOR_COND_CLEANUP46_LOOPEXIT:%.*]], label [[FOR_BODY47]], [[LOOP9:!llvm.loop !.*]]82;83for.body47.lr.ph:84 call void @llvm.experimental.noalias.scope.decl(metadata !5)85 br label %for.body4786 87for.cond.cleanup46: ; preds = %cond.end88 ret void89 90for.body47: ; preds = %cond.end, %for.body47.lr.ph91 %j.02 = phi i32 [ 0, %for.body47.lr.ph ], [ %inc, %cond.end ]92 call void @llvm.experimental.noalias.scope.decl(metadata !0)93 store i8 42, ptr %p0, !alias.scope !094 store i8 43, ptr %p1, !alias.scope !595 store i8 44, ptr %p2, !alias.scope !796 store i8 42, ptr %p0, !noalias !097 store i8 43, ptr %p1, !noalias !598 store i8 44, ptr %p2, !noalias !799 %cmp52 = icmp eq i32 %j.02, 0100 br i1 %cmp52, label %cond.true, label %cond.end101 102cond.true: ; preds = %for.body47103 store i8 52, ptr %p0, !alias.scope !0104 store i8 53, ptr %p1, !alias.scope !5105 store i8 54, ptr %p2, !alias.scope !7106 store i8 52, ptr %p0, !noalias !0107 store i8 53, ptr %p1, !noalias !5108 store i8 54, ptr %p2, !noalias !7109 br label %cond.end110 111cond.end: ; preds = %cond.true, %for.body47112 store i8 62, ptr %p0, !alias.scope !0113 store i8 63, ptr %p1, !alias.scope !5114 store i8 64, ptr %p2, !alias.scope !7115 store i8 62, ptr %p0, !noalias !0116 store i8 63, ptr %p1, !noalias !5117 store i8 64, ptr %p2, !noalias !7118 %inc = add nuw i32 %j.02, 1119 %exitcond.not = icmp eq i32 %inc, undef120 br i1 %exitcond.not, label %for.cond.cleanup46, label %for.body47, !llvm.loop !3121}122 123; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn124declare void @llvm.experimental.noalias.scope.decl(metadata) #0125 126attributes #0 = { inaccessiblememonly nofree nosync nounwind willreturn }127 128!0 = !{!1}129!1 = distinct !{!1, !2, !"foo: %inner.result"}130!2 = distinct !{!2, !"foo"}131!3 = distinct !{!3, !4}132!4 = !{!"llvm.loop.mustprogress"}133!5 = !{!6}134!6 = distinct !{!6, !2, !"foo: %outer.result"}135!7 = !{!1, !6}136 137; CHECK: !0 = !{!1}138; CHECK: !1 = distinct !{!1, !2, !"foo: %outer.result"}139; CHECK: !2 = distinct !{!2, !"foo"}140; CHECK: !3 = !{!4}141; CHECK: !4 = distinct !{!4, !2, !"foo: %inner.result:Peel0"}142; CHECK: !5 = !{!4, !1}143; CHECK: !6 = !{!7}144; CHECK: !7 = distinct !{!7, !2, !"foo: %inner.result"}145; CHECK: !8 = !{!7, !1}146; CHECK: !9 = distinct !{!9, !10, !11, !12}147; CHECK: !10 = !{!"llvm.loop.mustprogress"}148; CHECK: !11 = !{!"llvm.loop.peeled.count", i32 1}149; CHECK: !12 = !{!"llvm.loop.unroll.disable"}150