131 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -aa-pipeline=basic-aa -passes=loop-distribute -enable-loop-distribute -verify-loop-info -verify-dom-info -debug-only=loop-distribute --disable-output -S < %s 2>&1 | FileCheck %s3; REQUIRES: asserts4 5; Test if a loop already distributed will not reprocess because of metadata6; information marking it as processed.7 8; CHECK: LDist: Distributed loop guarded for reprocessing9; CHECK: LDist: Skipping;10 11define dso_local void @_Z13distribution3PiS_S_S_i(ptr noundef captures(none) %a, ptr noundef readonly captures(none) %b, ptr noundef captures(none) %c, ptr noundef writeonly captures(none) %d, i64 noundef signext %len) {12entry:13 %cmp = icmp sgt i64 %len, 014 br i1 %cmp, label %end, label %for.body.lver.check15 16for.body.lver.check: ; preds = %entry17 %0 = shl i64 %len, 218 %scevgep = getelementptr i8, ptr %a, i64 %019 %scevgep1 = getelementptr i8, ptr %c, i64 -420 %scevgep2 = getelementptr i8, ptr %c, i64 %021 %scevgep3 = getelementptr i8, ptr %d, i64 %022 %scevgep4 = getelementptr i8, ptr %b, i64 %023 %bound0 = icmp ult ptr %a, %scevgep224 %bound1 = icmp ult ptr %scevgep1, %scevgep25 %found.conflict = and i1 %bound0, %bound126 %bound05 = icmp ult ptr %a, %scevgep327 %bound16 = icmp ult ptr %d, %scevgep28 %found.conflict7 = and i1 %bound05, %bound1629 %conflict.rdx = or i1 %found.conflict, %found.conflict730 %bound08 = icmp ult ptr %a, %scevgep431 %bound19 = icmp ult ptr %b, %scevgep32 %found.conflict10 = and i1 %bound08, %bound1933 %conflict.rdx11 = or i1 %conflict.rdx, %found.conflict1034 %bound012 = icmp ult ptr %scevgep1, %scevgep335 %bound113 = icmp ult ptr %d, %scevgep236 %found.conflict14 = and i1 %bound012, %bound11337 %conflict.rdx15 = or i1 %conflict.rdx11, %found.conflict1438 %bound016 = icmp ult ptr %d, %scevgep439 %bound117 = icmp ult ptr %b, %scevgep340 %found.conflict18 = and i1 %bound016, %bound11741 %conflict.rdx19 = or i1 %conflict.rdx15, %found.conflict1842 br i1 %conflict.rdx19, label %for.body.ph.lver.orig, label %for.body.ph.ldist143 44for.body.ph.lver.orig: ; preds = %for.body.lver.check45 br label %for.body.lver.orig46 47for.body.lver.orig: ; preds = %for.body.lver.orig, %for.body.ph.lver.orig48 %indvars.iv.lver.orig = phi i64 [ 0, %for.body.ph.lver.orig ], [ %indvars.iv.next.lver.orig, %for.body.lver.orig ]49 %arrayidx.lver.orig = getelementptr inbounds i32, ptr %b, i64 %indvars.iv.lver.orig50 %i2.lver.orig = load i32, ptr %arrayidx.lver.orig, align 4, !tbaa !051 %add4.lver.orig = add nsw i32 %i2.lver.orig, 152 %arrayidx8.lver.orig = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.lver.orig53 store i32 %add4.lver.orig, ptr %arrayidx8.lver.orig, align 4, !tbaa !054 %i3.lver.orig = getelementptr i32, ptr %c, i64 %indvars.iv.lver.orig55 %arrayidx17.lver.orig = getelementptr i8, ptr %i3.lver.orig, i64 -456 %i4.lver.orig = load i32, ptr %arrayidx17.lver.orig, align 4, !tbaa !057 %sub18.lver.orig = sub nsw i32 %add4.lver.orig, %i4.lver.orig58 store i32 %sub18.lver.orig, ptr %i3.lver.orig, align 4, !tbaa !059 %i5.lver.orig = load i32, ptr %arrayidx8.lver.orig, align 4, !tbaa !060 %add27.lver.orig = add nsw i32 %i5.lver.orig, 261 %arrayidx31.lver.orig = getelementptr inbounds i32, ptr %d, i64 %indvars.iv.lver.orig62 store i32 %add27.lver.orig, ptr %arrayidx31.lver.orig, align 4, !tbaa !063 %indvars.iv.next.lver.orig = add i64 %indvars.iv.lver.orig, 164 %cmp1.not.lver.orig = icmp eq i64 %indvars.iv.next.lver.orig, %len65 br i1 %cmp1.not.lver.orig, label %end.loopexit.loopexit, label %for.body.lver.orig, !llvm.loop !466 67for.body.ph.ldist1: ; preds = %for.body.lver.check68 br label %for.body.ldist169 70for.body.ldist1: ; preds = %for.body.ldist1, %for.body.ph.ldist171 %indvars.iv.ldist1 = phi i64 [ 0, %for.body.ph.ldist1 ], [ %indvars.iv.next.ldist1, %for.body.ldist1 ]72 %arrayidx.ldist1 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv.ldist173 %i2.ldist1 = load i32, ptr %arrayidx.ldist1, align 4, !tbaa !0, !alias.scope !774 %add4.ldist1 = add nsw i32 %i2.ldist1, 175 %arrayidx8.ldist1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.ldist176 store i32 %add4.ldist1, ptr %arrayidx8.ldist1, align 4, !tbaa !0, !alias.scope !10, !noalias !1277 %i3.ldist1 = getelementptr i32, ptr %c, i64 %indvars.iv.ldist178 %arrayidx17.ldist1 = getelementptr i8, ptr %i3.ldist1, i64 -479 %i4.ldist1 = load i32, ptr %arrayidx17.ldist1, align 4, !tbaa !0, !alias.scope !15, !noalias !1680 %sub18.ldist1 = sub nsw i32 %add4.ldist1, %i4.ldist181 store i32 %sub18.ldist1, ptr %i3.ldist1, align 4, !tbaa !0, !alias.scope !15, !noalias !1682 %indvars.iv.next.ldist1 = add i64 %indvars.iv.ldist1, 183 %cmp1.not.ldist1 = icmp eq i64 %indvars.iv.next.ldist1, %len84 br i1 %cmp1.not.ldist1, label %for.body.ph, label %for.body.ldist1, !llvm.loop !1785 86for.body.ph: ; preds = %for.body.ldist187 br label %for.body88 89for.body: ; preds = %for.body, %for.body.ph90 %indvars.iv = phi i64 [ 0, %for.body.ph ], [ %indvars.iv.next, %for.body ]91 %arrayidx8 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv92 %i5 = load i32, ptr %arrayidx8, align 4, !tbaa !0, !alias.scope !10, !noalias !1293 %add27 = add nsw i32 %i5, 294 %arrayidx31 = getelementptr inbounds i32, ptr %d, i64 %indvars.iv95 store i32 %add27, ptr %arrayidx31, align 4, !tbaa !0, !alias.scope !16, !noalias !796 %indvars.iv.next = add i64 %indvars.iv, 197 %cmp1.not = icmp eq i64 %indvars.iv.next, %len98 br i1 %cmp1.not, label %end.loopexit.loopexit20, label %for.body, !llvm.loop !1799 100end.loopexit.loopexit: ; preds = %for.body.lver.orig101 br label %end.loopexit102 103end.loopexit.loopexit20: ; preds = %for.body104 br label %end.loopexit105 106end.loopexit: ; preds = %end.loopexit.loopexit20, %end.loopexit.loopexit107 br label %end108 109end: ; preds = %end.loopexit, %entry110 ret void111}112 113!0 = !{!1, !1, i64 0}114!1 = !{!"int", !2, i64 0}115!2 = !{!"omnipotent char", !3, i64 0}116!3 = !{!"Simple C++ TBAA"}117!4 = distinct !{!4, !5, !6}118!5 = !{!"llvm.loop.mustprogress"}119!6 = !{!"llvm.loop.isdistributed", i32 1}120!7 = !{!8}121!8 = distinct !{!8, !9}122!9 = distinct !{!9, !"LVerDomain"}123!10 = !{!11}124!11 = distinct !{!11, !9}125!12 = !{!13, !14, !8}126!13 = distinct !{!13, !9}127!14 = distinct !{!14, !9}128!15 = !{!13}129!16 = !{!14}130!17 = distinct !{!17, !5}131