1 ; RUN: opt -loop-unroll-and-jam -allow-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s 2 3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 4 target triple = "thumbv8m.main-arm-none-eabi" 5 6 ;; Common check for all tests. None should be unroll and jammed due to profitability 7 ; CHECK-NOT: remark: {{.*}} unroll and jammed 8 9 10 ; CHECK-LABEL: unprof1 11 ; Multiple inner loop blocks 12 define void @unprof1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ] 15 entry: 16 %cmp = icmp ne i32 %J, 0 17 %cmp122 = icmp ne i32 %I, 0 18 %or.cond = and i1 %cmp, %cmp122 19 br i1 %or.cond, label %for.outer.preheader, label %for.end 20 21 for.outer.preheader: 22 br label %for.outer 23 24 for.outer: 25 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ] 26 br label %for.inner 27 28 for.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, i32* %B, i32 %j 32 %0 = load i32, i32* %arrayidx, align 4 33 %add = add i32 %0, %sum1 34 br label %for.inner2 35 36 for.inner2: 37 %inc = add nuw i32 %j, 1 38 %exitcond = icmp eq i32 %inc, %J 39 br i1 %exitcond, label %for.latch, label %for.inner 40 41 for.latch: 42 %add.lcssa = phi i32 [ %add, %for.inner2 ] 43 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i 44 store i32 %add.lcssa, i32* %arrayidx6, align 4 45 %addinc = add nuw i32 %i, 1 46 %exitcond25 = icmp eq i32 %addinc, %I 47 br i1 %exitcond25, label %for.loopexit, label %for.outer 48 49 for.loopexit: 50 br label %for.end 51 52 for.end: 53 ret void 54 } 55 56 57 ; CHECK-LABEL: unprof2 58 ; Constant inner loop count 59 define void @unprof2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ] 62 entry: 63 %cmp = icmp ne i32 %J, 0 64 %cmp122 = icmp ne i32 %I, 0 65 %or.cond = and i1 %cmp, %cmp122 66 br i1 %or.cond, label %for.outer.preheader, label %for.end 67 68 for.outer.preheader: 69 br label %for.outer 70 71 for.outer: 72 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ] 73 br label %for.inner 74 75 for.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, i32* %B, i32 %j 79 %0 = load i32, i32* %arrayidx, align 4 80 %add = add i32 %0, %sum1 81 %inc = add nuw i32 %j, 1 82 %exitcond = icmp eq i32 %inc, 10 83 br i1 %exitcond, label %for.latch, label %for.inner 84 85 for.latch: 86 %add.lcssa = phi i32 [ %add, %for.inner ] 87 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i 88 store i32 %add.lcssa, i32* %arrayidx6, align 4 89 %addinc = add nuw i32 %i, 1 90 %exitcond25 = icmp eq i32 %addinc, %I 91 br i1 %exitcond25, label %for.loopexit, label %for.outer 92 93 for.loopexit: 94 br label %for.end 95 96 for.end: 97 ret void 98 } 99 100 101 ; CHECK-LABEL: unprof3 102 ; Complex inner loop 103 define void @unprof3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ] 106 entry: 107 %cmp = icmp ne i32 %J, 0 108 %cmp122 = icmp ne i32 %I, 0 109 %or.cond = and i1 %cmp, %cmp122 110 br i1 %or.cond, label %for.outer.preheader, label %for.end 111 112 for.outer.preheader: 113 br label %for.outer 114 115 for.outer: 116 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ] 117 br label %for.inner 118 119 for.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, i32* %B, i32 %j 123 %0 = load i32, i32* %arrayidx, align 4 124 %add = add i32 %0, %sum1 125 %add0 = add i32 %0, %sum1 126 %add1 = add i32 %0, %sum1 127 %add2 = add i32 %0, %sum1 128 %add3 = add i32 %0, %sum1 129 %add4 = add i32 %0, %sum1 130 %add5 = add i32 %0, %sum1 131 %add6 = add i32 %0, %sum1 132 %add7 = add i32 %0, %sum1 133 %add8 = add i32 %0, %sum1 134 %add9 = add i32 %0, %sum1 135 %add10 = add i32 %0, %sum1 136 %add11 = add i32 %0, %sum1 137 %add12 = add i32 %0, %sum1 138 %add13 = add i32 %0, %sum1 139 %add14 = add i32 %0, %sum1 140 %add15 = add i32 %0, %sum1 141 %add16 = add i32 %0, %sum1 142 %add17 = add i32 %0, %sum1 143 %add18 = add i32 %0, %sum1 144 %add19 = add i32 %0, %sum1 145 %add20 = add i32 %0, %sum1 146 %add21 = add i32 %0, %sum1 147 %add22 = add i32 %0, %sum1 148 %add23 = add i32 %0, %sum1 149 %add24 = add i32 %0, %sum1 150 %add25 = add i32 %0, %sum1 151 %add26 = add i32 %0, %sum1 152 %add27 = add i32 %0, %sum1 153 %add28 = add i32 %0, %sum1 154 %add29 = add i32 %0, %sum1 155 %inc = add nuw i32 %j, 1 156 %exitcond = icmp eq i32 %inc, %J 157 br i1 %exitcond, label %for.latch, label %for.inner 158 159 for.latch: 160 %add.lcssa = phi i32 [ %add, %for.inner ] 161 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i 162 store i32 %add.lcssa, i32* %arrayidx6, align 4 163 %addinc = add nuw i32 %i, 1 164 %exitcond25 = icmp eq i32 %addinc, %I 165 br i1 %exitcond25, label %for.loopexit, label %for.outer 166 167 for.loopexit: 168 br label %for.end 169 170 for.end: 171 ret void 172 } 173 174 175 ; CHECK-LABEL: unprof4 176 ; No loop invariant loads 177 define void @unprof4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ] 180 entry: 181 %cmp = icmp ne i32 %J, 0 182 %cmp122 = icmp ne i32 %I, 0 183 %or.cond = and i1 %cmp, %cmp122 184 br i1 %or.cond, label %for.outer.preheader, label %for.end 185 186 for.outer.preheader: 187 br label %for.outer 188 189 for.outer: 190 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ] 191 br label %for.inner 192 193 for.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, %i 197 %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j2 198 %0 = load i32, i32* %arrayidx, align 4 199 %add = add i32 %0, %sum1 200 %inc = add nuw i32 %j, 1 201 %exitcond = icmp eq i32 %inc, %J 202 br i1 %exitcond, label %for.latch, label %for.inner 203 204 for.latch: 205 %add.lcssa = phi i32 [ %add, %for.inner ] 206 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i 207 store i32 %add.lcssa, i32* %arrayidx6, align 4 208 %addinc = add nuw i32 %i, 1 209 %exitcond25 = icmp eq i32 %addinc, %I 210 br i1 %exitcond25, label %for.loopexit, label %for.outer 211 212 for.loopexit: 213 br label %for.end 214 215 for.end: 216 ret void 217 } 218