218 lines · plain
1; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s2 3target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"4target triple = "thumbv8m.main-arm-none-eabi"5 6;; Common check for all tests. None should be unroll and jammed due to profitability7; CHECK-NOT: remark: {{.*}} unroll and jammed8 9 10; CHECK-LABEL: unprof111; Multiple inner loop blocks12define void @unprof1(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {13; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]14; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]15entry:16 %cmp = icmp ne i32 %J, 017 %cmp122 = icmp ne i32 %I, 018 %or.cond = and i1 %cmp, %cmp12219 br i1 %or.cond, label %for.outer.preheader, label %for.end20 21for.outer.preheader:22 br label %for.outer23 24for.outer:25 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]26 br label %for.inner27 28for.inner:29 %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]30 %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner2 ]31 %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j32 %0 = load i32, ptr %arrayidx, align 433 %add = add i32 %0, %sum134br label %for.inner235 36for.inner2:37 %inc = add nuw i32 %j, 138 %exitcond = icmp eq i32 %inc, %J39 br i1 %exitcond, label %for.latch, label %for.inner40 41for.latch:42 %add.lcssa = phi i32 [ %add, %for.inner2 ]43 %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i44 store i32 %add.lcssa, ptr %arrayidx6, align 445 %addinc = add nuw i32 %i, 146 %exitcond25 = icmp eq i32 %addinc, %I47 br i1 %exitcond25, label %for.loopexit, label %for.outer48 49for.loopexit:50 br label %for.end51 52for.end:53 ret void54}55 56 57; CHECK-LABEL: unprof258; Constant inner loop count59define void @unprof2(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {60; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]61; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]62entry:63 %cmp = icmp ne i32 %J, 064 %cmp122 = icmp ne i32 %I, 065 %or.cond = and i1 %cmp, %cmp12266 br i1 %or.cond, label %for.outer.preheader, label %for.end67 68for.outer.preheader:69 br label %for.outer70 71for.outer:72 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]73 br label %for.inner74 75for.inner:76 %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]77 %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]78 %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j79 %0 = load i32, ptr %arrayidx, align 480 %add = add i32 %0, %sum181 %inc = add nuw i32 %j, 182 %exitcond = icmp eq i32 %inc, 1083 br i1 %exitcond, label %for.latch, label %for.inner84 85for.latch:86 %add.lcssa = phi i32 [ %add, %for.inner ]87 %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i88 store i32 %add.lcssa, ptr %arrayidx6, align 489 %addinc = add nuw i32 %i, 190 %exitcond25 = icmp eq i32 %addinc, %I91 br i1 %exitcond25, label %for.loopexit, label %for.outer92 93for.loopexit:94 br label %for.end95 96for.end:97 ret void98}99 100 101; CHECK-LABEL: unprof3102; Complex inner loop103define void @unprof3(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {104; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]105; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]106entry:107 %cmp = icmp ne i32 %J, 0108 %cmp122 = icmp ne i32 %I, 0109 %or.cond = and i1 %cmp, %cmp122110 br i1 %or.cond, label %for.outer.preheader, label %for.end111 112for.outer.preheader:113 br label %for.outer114 115for.outer:116 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]117 br label %for.inner118 119for.inner:120 %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]121 %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]122 %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j123 %0 = load i32, ptr %arrayidx, align 4124 %add = add i32 %0, %sum1125 %add0 = add i32 %0, %sum1126 %add1 = add i32 %0, %sum1127 %add2 = add i32 %0, %sum1128 %add3 = add i32 %0, %sum1129 %add4 = add i32 %0, %sum1130 %add5 = add i32 %0, %sum1131 %add6 = add i32 %0, %sum1132 %add7 = add i32 %0, %sum1133 %add8 = add i32 %0, %sum1134 %add9 = add i32 %0, %sum1135 %add10 = add i32 %0, %sum1136 %add11 = add i32 %0, %sum1137 %add12 = add i32 %0, %sum1138 %add13 = add i32 %0, %sum1139 %add14 = add i32 %0, %sum1140 %add15 = add i32 %0, %sum1141 %add16 = add i32 %0, %sum1142 %add17 = add i32 %0, %sum1143 %add18 = add i32 %0, %sum1144 %add19 = add i32 %0, %sum1145 %add20 = add i32 %0, %sum1146 %add21 = add i32 %0, %sum1147 %add22 = add i32 %0, %sum1148 %add23 = add i32 %0, %sum1149 %add24 = add i32 %0, %sum1150 %add25 = add i32 %0, %sum1151 %add26 = add i32 %0, %sum1152 %add27 = add i32 %0, %sum1153 %add28 = add i32 %0, %sum1154 %add29 = add i32 %0, %sum1155 %inc = add nuw i32 %j, 1156 %exitcond = icmp eq i32 %inc, %J157 br i1 %exitcond, label %for.latch, label %for.inner158 159for.latch:160 %add.lcssa = phi i32 [ %add, %for.inner ]161 %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i162 store i32 %add.lcssa, ptr %arrayidx6, align 4163 %addinc = add nuw i32 %i, 1164 %exitcond25 = icmp eq i32 %addinc, %I165 br i1 %exitcond25, label %for.loopexit, label %for.outer166 167for.loopexit:168 br label %for.end169 170for.end:171 ret void172}173 174 175; CHECK-LABEL: unprof4176; No loop invariant loads177define void @unprof4(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {178; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]179; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]180entry:181 %cmp = icmp ne i32 %J, 0182 %cmp122 = icmp ne i32 %I, 0183 %or.cond = and i1 %cmp, %cmp122184 br i1 %or.cond, label %for.outer.preheader, label %for.end185 186for.outer.preheader:187 br label %for.outer188 189for.outer:190 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]191 br label %for.inner192 193for.inner:194 %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]195 %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]196 %j2 = add i32 %j, %i197 %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j2198 %0 = load i32, ptr %arrayidx, align 4199 %add = add i32 %0, %sum1200 %inc = add nuw i32 %j, 1201 %exitcond = icmp eq i32 %inc, %J202 br i1 %exitcond, label %for.latch, label %for.inner203 204for.latch:205 %add.lcssa = phi i32 [ %add, %for.inner ]206 %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i207 store i32 %add.lcssa, ptr %arrayidx6, align 4208 %addinc = add nuw i32 %i, 1209 %exitcond25 = icmp eq i32 %addinc, %I210 br i1 %exitcond25, label %for.loopexit, label %for.outer211 212for.loopexit:213 br label %for.end214 215for.end:216 ret void217}218