1 ; RUN: opt < %s -analyze -basicaa -da | 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 ; CHECK-LABEL: t1 7 ;; for (int i = 0; i < n; i++) 8 ;; for (int j = 0; j < m; j++) 9 ;; for (int k = 0; k < o; k++) 10 ;; = A[i*m*o + j*o + k] 11 ;; A[i*m*o + j*o + k] = 12 define void @t1(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 13 ; CHECK: da analyze - none! 14 ; CHECK: da analyze - consistent anti [0 0 0|<]! 15 ; CHECK: da analyze - none! 16 entry: 17 %cmp49 = icmp sgt i32 %n, 0 18 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 19 20 for.cond1.preheader.lr.ph: ; preds = %entry 21 %cmp247 = icmp sgt i32 %m, 0 22 %cmp645 = icmp sgt i32 %o, 0 23 br label %for.cond1.preheader 24 25 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 26 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 27 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 28 29 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 30 %mul = mul nsw i32 %i.050, %m 31 br label %for.cond5.preheader 32 33 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 34 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 35 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 36 37 for.body8.lr.ph: ; preds = %for.cond5.preheader 38 %mul944 = add i32 %j.048, %mul 39 %add = mul i32 %mul944, %o 40 br label %for.body8 41 42 for.body8: ; preds = %for.body8, %for.body8.lr.ph 43 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 44 %add11 = add nsw i32 %k.046, %add 45 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 46 %0 = load i32, i32* %arrayidx, align 4 47 %add12 = add nsw i32 %0, 1 48 store i32 %add12, i32* %arrayidx, align 4 49 %inc = add nuw nsw i32 %k.046, 1 50 %exitcond = icmp eq i32 %inc, %o 51 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 52 53 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 54 %inc20 = add nuw nsw i32 %j.048, 1 55 %exitcond51 = icmp eq i32 %inc20, %m 56 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 57 58 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 59 %inc23 = add nuw nsw i32 %i.050, 1 60 %exitcond52 = icmp eq i32 %inc23, %n 61 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 62 63 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 64 ret void 65 } 66 67 ; CHECK-LABEL: t2 68 ;; for (int i = 0; i < n; i++) 69 ;; for (int j = 0; j < m; j++) 70 ;; for (int k = 0; k < o; k++) 71 ;; = A[i*m*o + j*o + k] 72 ;; A[i*m*o + j*o + k + 1] = 73 define void @t2(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 74 ; CHECK: da analyze - none! 75 ; CHECK: da analyze - anti [* * *|<]! 76 ; CHECK: da analyze - output [* * *]! 77 entry: 78 %cmp49 = icmp sgt i32 %n, 0 79 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 80 81 for.cond1.preheader.lr.ph: ; preds = %entry 82 %cmp247 = icmp sgt i32 %m, 0 83 %cmp645 = icmp sgt i32 %o, 0 84 br label %for.cond1.preheader 85 86 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 87 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 88 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 89 90 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 91 %mul = mul nsw i32 %i.050, %m 92 br label %for.cond5.preheader 93 94 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 95 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 96 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 97 98 for.body8.lr.ph: ; preds = %for.cond5.preheader 99 %mul944 = add i32 %j.048, %mul 100 %add = mul i32 %mul944, %o 101 br label %for.body8 102 103 for.body8: ; preds = %for.body8, %for.body8.lr.ph 104 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 105 %add11 = add nsw i32 %k.046, %add 106 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 107 %0 = load i32, i32* %arrayidx, align 4 108 %add12 = add nsw i32 %0, 1 109 %add111 = add nsw i32 %add11, 1 110 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 111 store i32 %add12, i32* %arrayidx2, align 4 112 %inc = add nuw nsw i32 %k.046, 1 113 %exitcond = icmp eq i32 %inc, %o 114 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 115 116 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 117 %inc20 = add nuw nsw i32 %j.048, 1 118 %exitcond51 = icmp eq i32 %inc20, %m 119 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 120 121 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 122 %inc23 = add nuw nsw i32 %i.050, 1 123 %exitcond52 = icmp eq i32 %inc23, %n 124 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 125 126 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 127 ret void 128 } 129 130 ; CHECK-LABEL: t3 131 ;; for (int i = 0; i < n; i++) 132 ;; for (int j = 0; j < m; j++) 133 ;; for (int k = 0; k < o; k++) 134 ;; = A[i*m*o + j*o + k] 135 ;; A[i*m*o + j*o + k - 1] = 136 define void @t3(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 137 ; CHECK: da analyze - none! 138 ; CHECK: da analyze - anti [* * *|<]! 139 ; CHECK: da analyze - output [* * *]! 140 entry: 141 %cmp49 = icmp sgt i32 %n, 0 142 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 143 144 for.cond1.preheader.lr.ph: ; preds = %entry 145 %cmp247 = icmp sgt i32 %m, 0 146 %cmp645 = icmp sgt i32 %o, 0 147 br label %for.cond1.preheader 148 149 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 150 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 151 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 152 153 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 154 %mul = mul nsw i32 %i.050, %m 155 br label %for.cond5.preheader 156 157 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 158 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 159 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 160 161 for.body8.lr.ph: ; preds = %for.cond5.preheader 162 %mul944 = add i32 %j.048, %mul 163 %add = mul i32 %mul944, %o 164 br label %for.body8 165 166 for.body8: ; preds = %for.body8, %for.body8.lr.ph 167 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 168 %add11 = add nsw i32 %k.046, %add 169 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 170 %0 = load i32, i32* %arrayidx, align 4 171 %add12 = add nsw i32 %0, 1 172 %add111 = sub nsw i32 %add11, 1 173 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 174 store i32 %add12, i32* %arrayidx2, align 4 175 %inc = add nuw nsw i32 %k.046, 1 176 %exitcond = icmp eq i32 %inc, %o 177 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 178 179 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 180 %inc20 = add nuw nsw i32 %j.048, 1 181 %exitcond51 = icmp eq i32 %inc20, %m 182 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 183 184 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 185 %inc23 = add nuw nsw i32 %i.050, 1 186 %exitcond52 = icmp eq i32 %inc23, %n 187 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 188 189 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 190 ret void 191 } 192 193 ; CHECK-LABEL: t4 194 ;; for (int i = 0; i < n; i++) 195 ;; for (int j = 0; j < m; j++) 196 ;; for (int k = 0; k < o; k++) 197 ;; = A[i*m*o + j*o + k] 198 ;; A[i*m*o + j*o + k + o] = 199 define void @t4(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 200 ; CHECK: da analyze - none! 201 ; CHECK: da analyze - anti [* * *|<]! 202 ; CHECK: da analyze - output [* * *]! 203 entry: 204 %cmp49 = icmp sgt i32 %n, 0 205 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 206 207 for.cond1.preheader.lr.ph: ; preds = %entry 208 %cmp247 = icmp sgt i32 %m, 0 209 %cmp645 = icmp sgt i32 %o, 0 210 br label %for.cond1.preheader 211 212 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 213 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 214 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 215 216 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 217 %mul = mul nsw i32 %i.050, %m 218 br label %for.cond5.preheader 219 220 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 221 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 222 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 223 224 for.body8.lr.ph: ; preds = %for.cond5.preheader 225 %mul944 = add i32 %j.048, %mul 226 %add = mul i32 %mul944, %o 227 br label %for.body8 228 229 for.body8: ; preds = %for.body8, %for.body8.lr.ph 230 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 231 %add11 = add nsw i32 %k.046, %add 232 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 233 %0 = load i32, i32* %arrayidx, align 4 234 %add12 = add nsw i32 %0, 1 235 %add111 = add nsw i32 %add11, %o 236 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 237 store i32 %add12, i32* %arrayidx2, align 4 238 %inc = add nuw nsw i32 %k.046, 1 239 %exitcond = icmp eq i32 %inc, %o 240 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 241 242 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 243 %inc20 = add nuw nsw i32 %j.048, 1 244 %exitcond51 = icmp eq i32 %inc20, %m 245 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 246 247 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 248 %inc23 = add nuw nsw i32 %i.050, 1 249 %exitcond52 = icmp eq i32 %inc23, %n 250 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 251 252 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 253 ret void 254 } 255 256 ; CHECK-LABEL: t5 257 ;; for (int i = 0; i < n; i++) 258 ;; for (int j = 0; j < m; j++) 259 ;; for (int k = 0; k < o; k++) 260 ;; = A[i*m*o + j*o + k] 261 ;; A[i*m*o + j*o + k - o] = 262 define void @t5(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 263 ; CHECK: da analyze - none! 264 ; CHECK: da analyze - anti [* * *|<]! 265 ; CHECK: da analyze - output [* * *]! 266 entry: 267 %cmp49 = icmp sgt i32 %n, 0 268 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 269 270 for.cond1.preheader.lr.ph: ; preds = %entry 271 %cmp247 = icmp sgt i32 %m, 0 272 %cmp645 = icmp sgt i32 %o, 0 273 br label %for.cond1.preheader 274 275 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 276 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 277 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 278 279 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 280 %mul = mul nsw i32 %i.050, %m 281 br label %for.cond5.preheader 282 283 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 284 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 285 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 286 287 for.body8.lr.ph: ; preds = %for.cond5.preheader 288 %mul944 = add i32 %j.048, %mul 289 %add = mul i32 %mul944, %o 290 br label %for.body8 291 292 for.body8: ; preds = %for.body8, %for.body8.lr.ph 293 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 294 %add11 = add nsw i32 %k.046, %add 295 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 296 %0 = load i32, i32* %arrayidx, align 4 297 %add12 = add nsw i32 %0, 1 298 %add111 = sub nsw i32 %add11, %o 299 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 300 store i32 %add12, i32* %arrayidx2, align 4 301 %inc = add nuw nsw i32 %k.046, 1 302 %exitcond = icmp eq i32 %inc, %o 303 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 304 305 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 306 %inc20 = add nuw nsw i32 %j.048, 1 307 %exitcond51 = icmp eq i32 %inc20, %m 308 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 309 310 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 311 %inc23 = add nuw nsw i32 %i.050, 1 312 %exitcond52 = icmp eq i32 %inc23, %n 313 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 314 315 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 316 ret void 317 } 318 319 ; CHECK-LABEL: t6 320 ;; for (int i = 0; i < n; i++) 321 ;; for (int j = 0; j < m; j++) 322 ;; for (int k = 0; k < o; k++) 323 ;; = A[i*m*o + j*o + k] 324 ;; A[i*m*o + j*o + k + m*o] = 325 define void @t6(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 326 ; CHECK: da analyze - none! 327 ; CHECK: da analyze - consistent anti [-1 0 0]! 328 ; CHECK: da analyze - none! 329 entry: 330 %cmp49 = icmp sgt i32 %n, 0 331 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 332 333 for.cond1.preheader.lr.ph: ; preds = %entry 334 %cmp247 = icmp sgt i32 %m, 0 335 %cmp645 = icmp sgt i32 %o, 0 336 br label %for.cond1.preheader 337 338 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 339 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 340 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 341 342 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 343 %mul = mul nsw i32 %i.050, %m 344 br label %for.cond5.preheader 345 346 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 347 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 348 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 349 350 for.body8.lr.ph: ; preds = %for.cond5.preheader 351 %mul944 = add i32 %j.048, %mul 352 %add = mul i32 %mul944, %o 353 br label %for.body8 354 355 for.body8: ; preds = %for.body8, %for.body8.lr.ph 356 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 357 %add11 = add nsw i32 %k.046, %add 358 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 359 %0 = load i32, i32* %arrayidx, align 4 360 %add12 = add nsw i32 %0, 1 361 %mo = mul i32 %m, %o 362 %add111 = add nsw i32 %add11, %mo 363 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 364 store i32 %add12, i32* %arrayidx2, align 4 365 %inc = add nuw nsw i32 %k.046, 1 366 %exitcond = icmp eq i32 %inc, %o 367 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 368 369 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 370 %inc20 = add nuw nsw i32 %j.048, 1 371 %exitcond51 = icmp eq i32 %inc20, %m 372 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 373 374 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 375 %inc23 = add nuw nsw i32 %i.050, 1 376 %exitcond52 = icmp eq i32 %inc23, %n 377 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 378 379 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 380 ret void 381 } 382 383 ; CHECK-LABEL: t7 384 ;; for (int i = 0; i < n; i++) 385 ;; for (int j = 0; j < m; j++) 386 ;; for (int k = 0; k < o; k++) 387 ;; = A[i*m*o + j*o + k] 388 ;; A[i*m*o + j*o + k - m*o] = 389 define void @t7(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 390 ; CHECK: da analyze - none! 391 ; CHECK: da analyze - consistent anti [1 0 0]! 392 ; CHECK: da analyze - none! 393 entry: 394 %cmp49 = icmp sgt i32 %n, 0 395 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 396 397 for.cond1.preheader.lr.ph: ; preds = %entry 398 %cmp247 = icmp sgt i32 %m, 0 399 %cmp645 = icmp sgt i32 %o, 0 400 br label %for.cond1.preheader 401 402 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 403 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 404 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 405 406 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 407 %mul = mul nsw i32 %i.050, %m 408 br label %for.cond5.preheader 409 410 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 411 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 412 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 413 414 for.body8.lr.ph: ; preds = %for.cond5.preheader 415 %mul944 = add i32 %j.048, %mul 416 %add = mul i32 %mul944, %o 417 br label %for.body8 418 419 for.body8: ; preds = %for.body8, %for.body8.lr.ph 420 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 421 %add11 = add nsw i32 %k.046, %add 422 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 423 %0 = load i32, i32* %arrayidx, align 4 424 %add12 = add nsw i32 %0, 1 425 %mo = mul i32 %m, %o 426 %add111 = sub nsw i32 %add11, %mo 427 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 428 store i32 %add12, i32* %arrayidx2, align 4 429 %inc = add nuw nsw i32 %k.046, 1 430 %exitcond = icmp eq i32 %inc, %o 431 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 432 433 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 434 %inc20 = add nuw nsw i32 %j.048, 1 435 %exitcond51 = icmp eq i32 %inc20, %m 436 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 437 438 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 439 %inc23 = add nuw nsw i32 %i.050, 1 440 %exitcond52 = icmp eq i32 %inc23, %n 441 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 442 443 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 444 ret void 445 } 446 447 ; CHECK-LABEL: t8 448 ;; for (int i = 0; i < n; i++) 449 ;; for (int j = 0; j < m; j++) 450 ;; for (int k = 1; k < o; k++) 451 ;; = A[i*m*o + j*o + k] 452 ;; A[i*m*o + j*o + k - 1] = 453 define void @t8(i32 %n, i32 %m, i32 %o, i32* nocapture %A) { 454 ; CHECK: da analyze - none! 455 ; CHECK: da analyze - consistent anti [0 0 1]! 456 ; CHECK: da analyze - none! 457 entry: 458 %cmp49 = icmp sgt i32 %n, 0 459 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 460 461 for.cond1.preheader.lr.ph: ; preds = %entry 462 %cmp247 = icmp sgt i32 %m, 0 463 %cmp645 = icmp sgt i32 %o, 0 464 br label %for.cond1.preheader 465 466 for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 467 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 468 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 469 470 for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 471 %mul = mul nsw i32 %i.050, %m 472 br label %for.cond5.preheader 473 474 for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 475 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 476 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 477 478 for.body8.lr.ph: ; preds = %for.cond5.preheader 479 %mul944 = add i32 %j.048, %mul 480 %add = mul i32 %mul944, %o 481 br label %for.body8 482 483 for.body8: ; preds = %for.body8, %for.body8.lr.ph 484 %k.046 = phi i32 [ 1, %for.body8.lr.ph ], [ %inc, %for.body8 ] 485 %add11 = add nsw i32 %k.046, %add 486 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11 487 %0 = load i32, i32* %arrayidx, align 4 488 %add12 = add nsw i32 %0, 1 489 %add111 = sub nsw i32 %add11, 1 490 %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111 491 store i32 %add12, i32* %arrayidx2, align 4 492 %inc = add nuw nsw i32 %k.046, 1 493 %exitcond = icmp eq i32 %inc, %o 494 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 495 496 for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 497 %inc20 = add nuw nsw i32 %j.048, 1 498 %exitcond51 = icmp eq i32 %inc20, %m 499 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 500 501 for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 502 %inc23 = add nuw nsw i32 %i.050, 1 503 %exitcond52 = icmp eq i32 %inc23, %n 504 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 505 506 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 507 ret void 508 } 509 510 511 ; CHECK-LABEL: test_sizes 512 define double @test_sizes(i16 %h, i16 %N, i16* nocapture %array) { 513 ; CHECK: da analyze - consistent input [0 S]! 514 ; CHECK: da analyze - anti [* *|<]! 515 ; CHECK: da analyze - output [* *]! 516 entry: 517 %cmp28 = icmp sgt i16 %N, 1 518 br i1 %cmp28, label %for.body.lr.ph, label %for.end12 519 520 for.body.lr.ph: ; preds = %entry 521 %cmp425 = icmp slt i16 %h, 0 522 %0 = add i16 %h, 1 523 %wide.trip.count = zext i16 %N to i32 524 br label %for.body 525 526 for.body: ; preds = %for.inc10, %for.body.lr.ph 527 %indvars.iv32 = phi i32 [ 1, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc10 ] 528 %indvars.iv = phi i16 [ 2, %for.body.lr.ph ], [ %indvars.iv.next, %for.inc10 ] 529 br i1 %cmp425, label %for.inc10, label %for.body5.lr.ph 530 531 for.body5.lr.ph: ; preds = %for.body 532 %1 = sext i16 %indvars.iv to i32 533 %arrayidx = getelementptr inbounds i16, i16* %array, i32 %indvars.iv32 534 br label %for.body5 535 536 for.body5: ; preds = %for.body5, %for.body5.lr.ph 537 %indvars.iv30 = phi i32 [ %indvars.iv.next31, %for.body5 ], [ %1, %for.body5.lr.ph ] 538 %j.027 = phi i16 [ %inc, %for.body5 ], [ 0, %for.body5.lr.ph ] 539 %2 = load i16, i16* %arrayidx, align 4 540 %add6 = add nsw i16 %2, %j.027 541 %arrayidx8 = getelementptr inbounds i16, i16* %array, i32 %indvars.iv30 542 store i16 %add6, i16* %arrayidx8, align 4 543 %inc = add nuw nsw i16 %j.027, 1 544 %indvars.iv.next31 = add nsw i32 %indvars.iv30, 1 545 %exitcond = icmp eq i16 %inc, %0 546 br i1 %exitcond, label %for.inc10, label %for.body5 547 548 for.inc10: ; preds = %for.body5, %for.body 549 %indvars.iv.next33 = add nuw nsw i32 %indvars.iv32, 1 550 %indvars.iv.next = add i16 %indvars.iv, %0 551 %exitcond34 = icmp eq i32 %indvars.iv.next33, %wide.trip.count 552 br i1 %exitcond34, label %for.end12, label %for.body 553 554 for.end12: ; preds = %for.inc10, %entry 555 ret double undef 556 } 557 558 559 ; CHECK-LABEL: nonnegative 560 define void @nonnegative(i32* nocapture %A, i32 %N) { 561 ; CHECK: da analyze - none! 562 ; CHECK: da analyze - consistent output [0 0|<]! 563 ; CHECK: da analyze - none! 564 entry: 565 %cmp44 = icmp eq i32 %N, 0 566 br i1 %cmp44, label %exit, label %for.outer 567 568 for.outer: 569 %h.045 = phi i32 [ %add19, %for.latch ], [ 0, %entry ] 570 %mul = mul i32 %h.045, %N 571 br label %for.inner 572 573 for.inner: 574 %i.043 = phi i32 [ 0, %for.outer ], [ %add16, %for.inner ] 575 %add = add i32 %i.043, %mul 576 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add 577 store i32 1, i32* %arrayidx, align 4 578 store i32 2, i32* %arrayidx, align 4 579 %add16 = add nuw i32 %i.043, 1 580 %exitcond46 = icmp eq i32 %add16, %N 581 br i1 %exitcond46, label %for.latch, label %for.inner 582 583 for.latch: 584 %add19 = add nuw i32 %h.045, 1 585 %exitcond47 = icmp eq i32 %add19, %N 586 br i1 %exitcond47, label %exit, label %for.outer 587 588 exit: 589 ret void 590 } 591