brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 3788185 Raw
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