1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s 2 3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 4 target triple = "x86_64-apple-macosx10.6.0" 5 6 7 ;; for (long int i = 0; i < 50; i++) { 8 ;; A[i][i] = i; 9 ;; *B++ = A[i + 10][i + 9]; 10 11 define void @couple0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 12 entry: 13 br label %for.body 14 15 ; CHECK-LABEL: couple0 16 ; CHECK: da analyze - none! 17 ; CHECK: da analyze - none! 18 ; CHECK: da analyze - confused! 19 ; CHECK: da analyze - none! 20 ; CHECK: da analyze - confused! 21 ; CHECK: da analyze - none! 22 23 for.body: ; preds = %entry, %for.body 24 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 25 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 26 %conv = trunc i64 %i.02 to i32 27 %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 28 store i32 %conv, i32* %arrayidx1, align 4 29 %add = add nsw i64 %i.02, 9 30 %add2 = add nsw i64 %i.02, 10 31 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add 32 %0 = load i32, i32* %arrayidx4, align 4 33 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 34 store i32 %0, i32* %B.addr.01, align 4 35 %inc = add nsw i64 %i.02, 1 36 %exitcond = icmp ne i64 %inc, 50 37 br i1 %exitcond, label %for.body, label %for.end 38 39 for.end: ; preds = %for.body 40 ret void 41 } 42 43 44 ;; for (long int i = 0; i < 50; i++) { 45 ;; A[i][i] = i; 46 ;; *B++ = A[i + 9][i + 9]; 47 48 define void @couple1([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 49 entry: 50 br label %for.body 51 52 ; CHECK-LABEL: couple1 53 ; CHECK: da analyze - none! 54 ; CHECK: da analyze - consistent flow [-9]! 55 ; CHECK: da analyze - confused! 56 ; CHECK: da analyze - none! 57 ; CHECK: da analyze - confused! 58 ; CHECK: da analyze - none! 59 60 for.body: ; preds = %entry, %for.body 61 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 62 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 63 %conv = trunc i64 %i.02 to i32 64 %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 65 store i32 %conv, i32* %arrayidx1, align 4 66 %add = add nsw i64 %i.02, 9 67 %add2 = add nsw i64 %i.02, 9 68 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add 69 %0 = load i32, i32* %arrayidx4, align 4 70 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 71 store i32 %0, i32* %B.addr.01, align 4 72 %inc = add nsw i64 %i.02, 1 73 %exitcond = icmp ne i64 %inc, 50 74 br i1 %exitcond, label %for.body, label %for.end 75 76 for.end: ; preds = %for.body 77 ret void 78 } 79 80 81 ;; for (long int i = 0; i < 50; i++) { 82 ;; A[3*i - 6][3*i - 6] = i; 83 ;; *B++ = A[i][i]; 84 85 define void @couple2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 86 entry: 87 br label %for.body 88 89 ; CHECK-LABEL: couple2 90 ; CHECK: da analyze - none! 91 ; CHECK: da analyze - flow [<]! 92 ; CHECK: da analyze - confused! 93 ; CHECK: da analyze - none! 94 ; CHECK: da analyze - confused! 95 ; CHECK: da analyze - none! 96 97 for.body: ; preds = %entry, %for.body 98 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 99 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 100 %conv = trunc i64 %i.02 to i32 101 %mul = mul nsw i64 %i.02, 3 102 %sub = add nsw i64 %mul, -6 103 %mul1 = mul nsw i64 %i.02, 3 104 %sub2 = add nsw i64 %mul1, -6 105 %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub 106 store i32 %conv, i32* %arrayidx3, align 4 107 %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 108 %0 = load i32, i32* %arrayidx5, align 4 109 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 110 store i32 %0, i32* %B.addr.01, align 4 111 %inc = add nsw i64 %i.02, 1 112 %exitcond = icmp ne i64 %inc, 50 113 br i1 %exitcond, label %for.body, label %for.end 114 115 for.end: ; preds = %for.body 116 ret void 117 } 118 119 120 ;; for (long int i = 0; i < 50; i++) { 121 ;; A[3*i - 6][3*i - 5] = i; 122 ;; *B++ = A[i][i]; 123 124 define void @couple3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 125 entry: 126 br label %for.body 127 128 ; CHECK-LABEL: couple3 129 ; CHECK: da analyze - none! 130 ; CHECK: da analyze - none! 131 ; CHECK: da analyze - confused! 132 ; CHECK: da analyze - none! 133 ; CHECK: da analyze - confused! 134 ; CHECK: da analyze - none! 135 136 for.body: ; preds = %entry, %for.body 137 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 138 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 139 %conv = trunc i64 %i.02 to i32 140 %mul = mul nsw i64 %i.02, 3 141 %sub = add nsw i64 %mul, -5 142 %mul1 = mul nsw i64 %i.02, 3 143 %sub2 = add nsw i64 %mul1, -6 144 %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub 145 store i32 %conv, i32* %arrayidx3, align 4 146 %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 147 %0 = load i32, i32* %arrayidx5, align 4 148 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 149 store i32 %0, i32* %B.addr.01, align 4 150 %inc = add nsw i64 %i.02, 1 151 %exitcond = icmp ne i64 %inc, 50 152 br i1 %exitcond, label %for.body, label %for.end 153 154 for.end: ; preds = %for.body 155 ret void 156 } 157 158 159 ;; for (long int i = 0; i < 50; i++) { 160 ;; A[3*i - 6][3*i - n] = i; 161 ;; *B++ = A[i][i]; 162 163 define void @couple4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 164 entry: 165 br label %for.body 166 167 ; CHECK-LABEL: couple4 168 ; CHECK: da analyze - none! 169 ; CHECK: da analyze - flow [*|<]! 170 ; CHECK: da analyze - confused! 171 ; CHECK: da analyze - none! 172 ; CHECK: da analyze - confused! 173 ; CHECK: da analyze - none! 174 175 for.body: ; preds = %entry, %for.body 176 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 177 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 178 %conv = trunc i64 %i.02 to i32 179 %mul = mul nsw i64 %i.02, 3 180 %conv1 = sext i32 %n to i64 181 %sub = sub nsw i64 %mul, %conv1 182 %mul2 = mul nsw i64 %i.02, 3 183 %sub3 = add nsw i64 %mul2, -6 184 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub3, i64 %sub 185 store i32 %conv, i32* %arrayidx4, align 4 186 %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 187 %0 = load i32, i32* %arrayidx6, align 4 188 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 189 store i32 %0, i32* %B.addr.01, align 4 190 %inc = add nsw i64 %i.02, 1 191 %exitcond = icmp ne i64 %inc, 50 192 br i1 %exitcond, label %for.body, label %for.end 193 194 for.end: ; preds = %for.body 195 ret void 196 } 197 198 199 ;; for (long int i = 0; i < 50; i++) { 200 ;; A[3*i - n + 1][3*i - n] = i; 201 ;; *B++ = A[i][i]; 202 203 define void @couple5([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 204 entry: 205 br label %for.body 206 207 ; CHECK-LABEL: couple5 208 ; CHECK: da analyze - none! 209 ; CHECK: da analyze - none! 210 ; CHECK: da analyze - confused! 211 ; CHECK: da analyze - none! 212 ; CHECK: da analyze - confused! 213 ; CHECK: da analyze - none! 214 215 for.body: ; preds = %entry, %for.body 216 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 217 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 218 %conv = trunc i64 %i.02 to i32 219 %mul = mul nsw i64 %i.02, 3 220 %conv1 = sext i32 %n to i64 221 %sub = sub nsw i64 %mul, %conv1 222 %mul2 = mul nsw i64 %i.02, 3 223 %conv3 = sext i32 %n to i64 224 %sub4 = sub nsw i64 %mul2, %conv3 225 %add = add nsw i64 %sub4, 1 226 %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add, i64 %sub 227 store i32 %conv, i32* %arrayidx5, align 4 228 %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 229 %0 = load i32, i32* %arrayidx7, align 4 230 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 231 store i32 %0, i32* %B.addr.01, align 4 232 %inc = add nsw i64 %i.02, 1 233 %exitcond = icmp ne i64 %inc, 50 234 br i1 %exitcond, label %for.body, label %for.end 235 236 for.end: ; preds = %for.body 237 ret void 238 } 239 240 241 ;; for (long int i = 0; i < 50; i++) { 242 ;; A[i][3*i - 6] = i; 243 ;; *B++ = A[i][i]; 244 245 define void @couple6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 246 entry: 247 br label %for.body 248 249 ; CHECK-LABEL: couple6 250 ; CHECK: da analyze - none! 251 ; CHECK: da analyze - flow [<]! 252 ; CHECK: da analyze - confused! 253 ; CHECK: da analyze - none! 254 ; CHECK: da analyze - confused! 255 ; CHECK: da analyze - none! 256 257 for.body: ; preds = %entry, %for.body 258 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 259 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 260 %conv = trunc i64 %i.02 to i32 261 %mul = mul nsw i64 %i.02, 3 262 %sub = add nsw i64 %mul, -6 263 %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub 264 store i32 %conv, i32* %arrayidx1, align 4 265 %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 266 %0 = load i32, i32* %arrayidx3, align 4 267 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 268 store i32 %0, i32* %B.addr.01, align 4 269 %inc = add nsw i64 %i.02, 1 270 %exitcond = icmp ne i64 %inc, 50 271 br i1 %exitcond, label %for.body, label %for.end 272 273 for.end: ; preds = %for.body 274 ret void 275 } 276 277 278 ;; for (long int i = 0; i < 50; i++) { 279 ;; A[i][3*i - 5] = i; 280 ;; *B++ = A[i][i]; 281 282 define void @couple7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 283 entry: 284 br label %for.body 285 286 ; CHECK-LABEL: couple7 287 ; CHECK: da analyze - none! 288 ; CHECK: da analyze - none! 289 ; CHECK: da analyze - confused! 290 ; CHECK: da analyze - none! 291 ; CHECK: da analyze - confused! 292 ; CHECK: da analyze - none! 293 294 for.body: ; preds = %entry, %for.body 295 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 296 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 297 %conv = trunc i64 %i.02 to i32 298 %mul = mul nsw i64 %i.02, 3 299 %sub = add nsw i64 %mul, -5 300 %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub 301 store i32 %conv, i32* %arrayidx1, align 4 302 %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 303 %0 = load i32, i32* %arrayidx3, align 4 304 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 305 store i32 %0, i32* %B.addr.01, align 4 306 %inc = add nsw i64 %i.02, 1 307 %exitcond = icmp ne i64 %inc, 50 308 br i1 %exitcond, label %for.body, label %for.end 309 310 for.end: ; preds = %for.body 311 ret void 312 } 313 314 315 ;; for (long int i = 0; i <= 15; i++) { 316 ;; A[3*i - 18][3 - i] = i; 317 ;; *B++ = A[i][i]; 318 319 define void @couple8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 320 entry: 321 br label %for.body 322 323 ; CHECK-LABEL: couple8 324 ; CHECK: da analyze - none! 325 ; CHECK: da analyze - none! 326 ; CHECK: da analyze - confused! 327 ; CHECK: da analyze - none! 328 ; CHECK: da analyze - confused! 329 ; CHECK: da analyze - none! 330 331 for.body: ; preds = %entry, %for.body 332 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 333 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 334 %conv = trunc i64 %i.02 to i32 335 %sub = sub nsw i64 3, %i.02 336 %mul = mul nsw i64 %i.02, 3 337 %sub1 = add nsw i64 %mul, -18 338 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 339 store i32 %conv, i32* %arrayidx2, align 4 340 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 341 %0 = load i32, i32* %arrayidx4, align 4 342 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 343 store i32 %0, i32* %B.addr.01, align 4 344 %inc = add nsw i64 %i.02, 1 345 %exitcond = icmp ne i64 %inc, 16 346 br i1 %exitcond, label %for.body, label %for.end 347 348 for.end: ; preds = %for.body 349 ret void 350 } 351 352 353 ;; for (long int i = 0; i <= 15; i++) { 354 ;; A[3*i - 18][2 - i] = i; 355 ;; *B++ = A[i][i]; 356 357 define void @couple9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 358 entry: 359 br label %for.body 360 361 ; CHECK-LABEL: couple9 362 ; CHECK: da analyze - none! 363 ; CHECK: da analyze - none! 364 ; CHECK: da analyze - confused! 365 ; CHECK: da analyze - none! 366 ; CHECK: da analyze - confused! 367 ; CHECK: da analyze - none! 368 369 for.body: ; preds = %entry, %for.body 370 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 371 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 372 %conv = trunc i64 %i.02 to i32 373 %sub = sub nsw i64 2, %i.02 374 %mul = mul nsw i64 %i.02, 3 375 %sub1 = add nsw i64 %mul, -18 376 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 377 store i32 %conv, i32* %arrayidx2, align 4 378 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 379 %0 = load i32, i32* %arrayidx4, align 4 380 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 381 store i32 %0, i32* %B.addr.01, align 4 382 %inc = add nsw i64 %i.02, 1 383 %exitcond = icmp ne i64 %inc, 16 384 br i1 %exitcond, label %for.body, label %for.end 385 386 for.end: ; preds = %for.body 387 ret void 388 } 389 390 391 ;; for (long int i = 0; i <= 15; i++) { 392 ;; A[3*i - 18][6 - i] = i; 393 ;; *B++ = A[i][i]; 394 395 define void @couple10([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 396 entry: 397 br label %for.body 398 399 ; CHECK-LABEL: couple10 400 ; CHECK: da analyze - none! 401 ; CHECK: da analyze - flow [>]! 402 ; CHECK: da analyze - confused! 403 ; CHECK: da analyze - none! 404 ; CHECK: da analyze - confused! 405 ; CHECK: da analyze - none! 406 407 for.body: ; preds = %entry, %for.body 408 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 409 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 410 %conv = trunc i64 %i.02 to i32 411 %sub = sub nsw i64 6, %i.02 412 %mul = mul nsw i64 %i.02, 3 413 %sub1 = add nsw i64 %mul, -18 414 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 415 store i32 %conv, i32* %arrayidx2, align 4 416 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 417 %0 = load i32, i32* %arrayidx4, align 4 418 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 419 store i32 %0, i32* %B.addr.01, align 4 420 %inc = add nsw i64 %i.02, 1 421 %exitcond = icmp ne i64 %inc, 16 422 br i1 %exitcond, label %for.body, label %for.end 423 424 for.end: ; preds = %for.body 425 ret void 426 } 427 428 429 ;; for (long int i = 0; i <= 15; i++) { 430 ;; A[3*i - 18][18 - i] = i; 431 ;; *B++ = A[i][i]; 432 433 define void @couple11([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 434 entry: 435 br label %for.body 436 437 ; CHECK-LABEL: couple11 438 ; CHECK: da analyze - none! 439 ; CHECK: da analyze - flow [>]! 440 ; CHECK: da analyze - confused! 441 ; CHECK: da analyze - none! 442 ; CHECK: da analyze - confused! 443 ; CHECK: da analyze - none! 444 445 for.body: ; preds = %entry, %for.body 446 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 447 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 448 %conv = trunc i64 %i.02 to i32 449 %sub = sub nsw i64 18, %i.02 450 %mul = mul nsw i64 %i.02, 3 451 %sub1 = add nsw i64 %mul, -18 452 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 453 store i32 %conv, i32* %arrayidx2, align 4 454 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 455 %0 = load i32, i32* %arrayidx4, align 4 456 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 457 store i32 %0, i32* %B.addr.01, align 4 458 %inc = add nsw i64 %i.02, 1 459 %exitcond = icmp ne i64 %inc, 16 460 br i1 %exitcond, label %for.body, label %for.end 461 462 for.end: ; preds = %for.body 463 ret void 464 } 465 466 467 ;; for (long int i = 0; i <= 12; i++) { 468 ;; A[3*i - 18][22 - i] = i; 469 ;; *B++ = A[i][i]; 470 471 define void @couple12([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 472 entry: 473 br label %for.body 474 475 ; CHECK-LABEL: couple12 476 ; CHECK: da analyze - none! 477 ; CHECK: da analyze - flow [>]! 478 ; CHECK: da analyze - confused! 479 ; CHECK: da analyze - none! 480 ; CHECK: da analyze - confused! 481 ; CHECK: da analyze - none! 482 483 for.body: ; preds = %entry, %for.body 484 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 485 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 486 %conv = trunc i64 %i.02 to i32 487 %sub = sub nsw i64 22, %i.02 488 %mul = mul nsw i64 %i.02, 3 489 %sub1 = add nsw i64 %mul, -18 490 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 491 store i32 %conv, i32* %arrayidx2, align 4 492 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 493 %0 = load i32, i32* %arrayidx4, align 4 494 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 495 store i32 %0, i32* %B.addr.01, align 4 496 %inc = add nsw i64 %i.02, 1 497 %exitcond = icmp ne i64 %inc, 13 498 br i1 %exitcond, label %for.body, label %for.end 499 500 for.end: ; preds = %for.body 501 ret void 502 } 503 504 505 ;; for (long int i = 0; i < 12; i++) { 506 ;; A[3*i - 18][22 - i] = i; 507 ;; *B++ = A[i][i]; 508 509 define void @couple13([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 510 entry: 511 br label %for.body 512 513 ; CHECK-LABEL: couple13 514 ; CHECK: da analyze - none! 515 ; CHECK: da analyze - none! 516 ; CHECK: da analyze - confused! 517 ; CHECK: da analyze - none! 518 ; CHECK: da analyze - confused! 519 ; CHECK: da analyze - none! 520 521 for.body: ; preds = %entry, %for.body 522 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 523 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 524 %conv = trunc i64 %i.02 to i32 525 %sub = sub nsw i64 22, %i.02 526 %mul = mul nsw i64 %i.02, 3 527 %sub1 = add nsw i64 %mul, -18 528 %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub 529 store i32 %conv, i32* %arrayidx2, align 4 530 %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02 531 %0 = load i32, i32* %arrayidx4, align 4 532 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 533 store i32 %0, i32* %B.addr.01, align 4 534 %inc = add nsw i64 %i.02, 1 535 %exitcond = icmp ne i64 %inc, 12 536 br i1 %exitcond, label %for.body, label %for.end 537 538 for.end: ; preds = %for.body 539 ret void 540 } 541 542 ;; for (long int i = 0; i < 100; i++) { 543 ;; A[3*i - 18][18 - i][i] = i; 544 ;; *B++ = A[i][i][i]; 545 546 define void @couple14([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 547 entry: 548 br label %for.body 549 550 ; CHECK-LABEL: couple14 551 ; CHECK: da analyze - none! 552 ; CHECK: da analyze - flow [<]! 553 ; CHECK: da analyze - confused! 554 ; CHECK: da analyze - none! 555 ; CHECK: da analyze - confused! 556 ; CHECK: da analyze - none! 557 558 for.body: ; preds = %entry, %for.body 559 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 560 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 561 %conv = trunc i64 %i.02 to i32 562 %sub = sub nsw i64 18, %i.02 563 %mul = mul nsw i64 %i.02, 3 564 %sub1 = add nsw i64 %mul, -18 565 %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02 566 store i32 %conv, i32* %arrayidx3, align 4 567 %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02 568 %0 = load i32, i32* %arrayidx6, align 4 569 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 570 store i32 %0, i32* %B.addr.01, align 4 571 %inc = add nsw i64 %i.02, 1 572 %exitcond = icmp ne i64 %inc, 100 573 br i1 %exitcond, label %for.body, label %for.end 574 575 for.end: ; preds = %for.body 576 ret void 577 } 578 579 580 ;; for (long int i = 0; i < 100; i++) { 581 ;; A[3*i - 18][22 - i][i] = i; 582 ;; *B++ = A[i][i][i]; 583 584 define void @couple15([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { 585 entry: 586 br label %for.body 587 588 ; CHECK-LABEL: couple15 589 ; CHECK: da analyze - none! 590 ; CHECK: da analyze - none! 591 ; CHECK: da analyze - confused! 592 ; CHECK: da analyze - none! 593 ; CHECK: da analyze - confused! 594 ; CHECK: da analyze - none! 595 596 for.body: ; preds = %entry, %for.body 597 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 598 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 599 %conv = trunc i64 %i.02 to i32 600 %sub = sub nsw i64 22, %i.02 601 %mul = mul nsw i64 %i.02, 3 602 %sub1 = add nsw i64 %mul, -18 603 %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02 604 store i32 %conv, i32* %arrayidx3, align 4 605 %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02 606 %0 = load i32, i32* %arrayidx6, align 4 607 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 608 store i32 %0, i32* %B.addr.01, align 4 609 %inc = add nsw i64 %i.02, 1 610 %exitcond = icmp ne i64 %inc, 100 611 br i1 %exitcond, label %for.body, label %for.end 612 613 for.end: ; preds = %for.body 614 ret void 615 } 616 617 ;; for(int i = 0; i < N; i+=1) { 618 ;; A[M*N*i] = 1; 619 ;; for(int j = 0; j < M; j+=1) 620 ;; A[M*N + M*i + j] = 2; 621 622 define void @couple_weakzerosiv(i32* noalias nocapture %A, i64 %N, i64 %M) { 623 entry: 624 %cmp29 = icmp sgt i64 %N, 0 625 br i1 %cmp29, label %for.body.lr.ph, label %for.cond.cleanup 626 627 ; CHECK-LABEL: couple_weakzerosiv 628 ; CHECK: da analyze - none! 629 ; CHECK: da analyze - output [p>]! 630 ; CHECK: da analyze - none! 631 632 for.body.lr.ph: ; preds = %entry 633 %mul = mul nsw i64 %M, %N 634 br label %for.body.us 635 636 for.body.us: ; preds = %for.body.lr.ph, %for.cond.cleanup4.loopexit.us 637 %i.030.us = phi i64 [ %add12.us, %for.cond.cleanup4.loopexit.us ], [ 0, %for.body.lr.ph ] 638 %mul1.us = mul nsw i64 %i.030.us, %mul 639 %arrayidx.us = getelementptr inbounds i32, i32* %A, i64 %mul1.us 640 store i32 1, i32* %arrayidx.us, align 4 641 %mul6.us = mul nsw i64 %i.030.us, %M 642 %add.us = add i64 %mul6.us, %mul 643 br label %for.body5.us 644 645 for.body5.us: ; preds = %for.body5.us, %for.body.us 646 %j.028.us = phi i64 [ 0, %for.body.us ], [ %add10.us, %for.body5.us ] 647 %add8.us = add i64 %add.us, %j.028.us 648 %arrayidx9.us = getelementptr inbounds i32, i32* %A, i64 %add8.us 649 store i32 2, i32* %arrayidx9.us, align 4 650 %add10.us = add nuw nsw i64 %j.028.us, 1 651 %exitcond.us = icmp eq i64 %add10.us, %M 652 br i1 %exitcond.us, label %for.cond.cleanup4.loopexit.us, label %for.body5.us 653 654 for.cond.cleanup4.loopexit.us: ; preds = %for.body5.us 655 %add12.us = add nuw nsw i64 %i.030.us, 1 656 %exitcond31.us = icmp eq i64 %add12.us, %N 657 br i1 %exitcond31.us, label %for.cond.cleanup, label %for.body.us 658 659 for.cond.cleanup: ; preds = %for.cond.cleanup4.loopexit.us, %entry 660 ret void 661 } 662