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 unsigned i = 0; i < 10; i++) { 8 ;; A[i + 10] = i; 9 ;; *B++ = A[2*i + 1]; 10 11 define void @exact0(i32* %A, i32* %B) nounwind uwtable ssp { 12 entry: 13 br label %for.body 14 15 ; CHECK-LABEL: exact0 16 ; CHECK: da analyze - none! 17 ; CHECK: da analyze - flow [>]! 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 %add = add i64 %i.02, 10 28 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 29 store i32 %conv, i32* %arrayidx, align 4 30 %mul = shl i64 %i.02, 1 31 %add13 = or i64 %mul, 1 32 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add13 33 %0 = load i32, i32* %arrayidx2, align 4 34 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 35 store i32 %0, i32* %B.addr.01, align 4 36 %inc = add i64 %i.02, 1 37 %exitcond = icmp ne i64 %inc, 10 38 br i1 %exitcond, label %for.body, label %for.end 39 40 for.end: ; preds = %for.body 41 ret void 42 } 43 44 45 ;; for (long unsigned i = 0; i < 10; i++) { 46 ;; A[4*i + 10] = i; 47 ;; *B++ = A[2*i + 1]; 48 49 define void @exact1(i32* %A, i32* %B) nounwind uwtable ssp { 50 entry: 51 br label %for.body 52 53 ; CHECK-LABEL: exact1 54 ; CHECK: da analyze - none! 55 ; CHECK: da analyze - none! 56 ; CHECK: da analyze - confused! 57 ; CHECK: da analyze - none! 58 ; CHECK: da analyze - confused! 59 ; CHECK: da analyze - none! 60 61 for.body: ; preds = %entry, %for.body 62 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 63 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 64 %conv = trunc i64 %i.02 to i32 65 %mul = shl i64 %i.02, 2 66 %add = add i64 %mul, 10 67 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 68 store i32 %conv, i32* %arrayidx, align 4 69 %mul1 = shl i64 %i.02, 1 70 %add23 = or i64 %mul1, 1 71 %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add23 72 %0 = load i32, i32* %arrayidx3, align 4 73 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 74 store i32 %0, i32* %B.addr.01, align 4 75 %inc = add i64 %i.02, 1 76 %exitcond = icmp ne i64 %inc, 10 77 br i1 %exitcond, label %for.body, label %for.end 78 79 for.end: ; preds = %for.body 80 ret void 81 } 82 83 84 ;; for (long unsigned i = 0; i < 10; i++) { 85 ;; A[6*i] = i; 86 ;; *B++ = A[i + 60]; 87 88 define void @exact2(i32* %A, i32* %B) nounwind uwtable ssp { 89 entry: 90 br label %for.body 91 92 ; CHECK-LABEL: exact2 93 ; CHECK: da analyze - none! 94 ; CHECK: da analyze - none! 95 ; CHECK: da analyze - confused! 96 ; CHECK: da analyze - none! 97 ; CHECK: da analyze - confused! 98 ; CHECK: da analyze - none! 99 100 for.body: ; preds = %entry, %for.body 101 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 102 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 103 %conv = trunc i64 %i.02 to i32 104 %mul = mul i64 %i.02, 6 105 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 106 store i32 %conv, i32* %arrayidx, align 4 107 %add = add i64 %i.02, 60 108 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 109 %0 = load i32, i32* %arrayidx1, align 4 110 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 111 store i32 %0, i32* %B.addr.01, align 4 112 %inc = add i64 %i.02, 1 113 %exitcond = icmp ne i64 %inc, 10 114 br i1 %exitcond, label %for.body, label %for.end 115 116 for.end: ; preds = %for.body 117 ret void 118 } 119 120 121 ;; for (long unsigned i = 0; i <= 10; i++) { 122 ;; A[6*i] = i; 123 ;; *B++ = A[i + 60]; 124 125 define void @exact3(i32* %A, i32* %B) nounwind uwtable ssp { 126 entry: 127 br label %for.body 128 129 ; CHECK-LABEL: exact3 130 ; CHECK: da analyze - none! 131 ; CHECK: da analyze - flow [<]! 132 ; CHECK: da analyze - confused! 133 ; CHECK: da analyze - none! 134 ; CHECK: da analyze - confused! 135 ; CHECK: da analyze - none! 136 137 for.body: ; preds = %entry, %for.body 138 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 139 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 140 %conv = trunc i64 %i.02 to i32 141 %mul = mul i64 %i.02, 6 142 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 143 store i32 %conv, i32* %arrayidx, align 4 144 %add = add i64 %i.02, 60 145 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 146 %0 = load i32, i32* %arrayidx1, align 4 147 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 148 store i32 %0, i32* %B.addr.01, align 4 149 %inc = add i64 %i.02, 1 150 %exitcond = icmp ne i64 %inc, 11 151 br i1 %exitcond, label %for.body, label %for.end 152 153 for.end: ; preds = %for.body 154 ret void 155 } 156 157 158 ;; for (long unsigned i = 0; i < 12; i++) { 159 ;; A[6*i] = i; 160 ;; *B++ = A[i + 60]; 161 162 define void @exact4(i32* %A, i32* %B) nounwind uwtable ssp { 163 entry: 164 br label %for.body 165 166 ; CHECK-LABEL: exact4 167 ; CHECK: da analyze - none! 168 ; CHECK: da analyze - flow [<]! 169 ; CHECK: da analyze - confused! 170 ; CHECK: da analyze - none! 171 ; CHECK: da analyze - confused! 172 ; CHECK: da analyze - none! 173 174 for.body: ; preds = %entry, %for.body 175 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 176 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 177 %conv = trunc i64 %i.02 to i32 178 %mul = mul i64 %i.02, 6 179 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 180 store i32 %conv, i32* %arrayidx, align 4 181 %add = add i64 %i.02, 60 182 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 183 %0 = load i32, i32* %arrayidx1, align 4 184 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 185 store i32 %0, i32* %B.addr.01, align 4 186 %inc = add i64 %i.02, 1 187 %exitcond = icmp ne i64 %inc, 12 188 br i1 %exitcond, label %for.body, label %for.end 189 190 for.end: ; preds = %for.body 191 ret void 192 } 193 194 195 ;; for (long unsigned i = 0; i <= 12; i++) { 196 ;; A[6*i] = i; 197 ;; *B++ = A[i + 60]; 198 199 define void @exact5(i32* %A, i32* %B) nounwind uwtable ssp { 200 entry: 201 br label %for.body 202 203 ; CHECK-LABEL: exact5 204 ; CHECK: da analyze - none! 205 ; CHECK: da analyze - flow [<]! 206 ; CHECK: da analyze - confused! 207 ; CHECK: da analyze - none! 208 ; CHECK: da analyze - confused! 209 ; CHECK: da analyze - none! 210 211 for.body: ; preds = %entry, %for.body 212 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 213 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 214 %conv = trunc i64 %i.02 to i32 215 %mul = mul i64 %i.02, 6 216 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 217 store i32 %conv, i32* %arrayidx, align 4 218 %add = add i64 %i.02, 60 219 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 220 %0 = load i32, i32* %arrayidx1, align 4 221 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 222 store i32 %0, i32* %B.addr.01, align 4 223 %inc = add i64 %i.02, 1 224 %exitcond = icmp ne i64 %inc, 13 225 br i1 %exitcond, label %for.body, label %for.end 226 227 for.end: ; preds = %for.body 228 ret void 229 } 230 231 232 ;; for (long unsigned i = 0; i < 18; i++) { 233 ;; A[6*i] = i; 234 ;; *B++ = A[i + 60]; 235 236 define void @exact6(i32* %A, i32* %B) nounwind uwtable ssp { 237 entry: 238 br label %for.body 239 240 ; CHECK-LABEL: exact6 241 ; CHECK: da analyze - none! 242 ; CHECK: da analyze - flow [<]! 243 ; CHECK: da analyze - confused! 244 ; CHECK: da analyze - none! 245 ; CHECK: da analyze - confused! 246 ; CHECK: da analyze - none! 247 248 for.body: ; preds = %entry, %for.body 249 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 250 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 251 %conv = trunc i64 %i.02 to i32 252 %mul = mul i64 %i.02, 6 253 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 254 store i32 %conv, i32* %arrayidx, align 4 255 %add = add i64 %i.02, 60 256 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 257 %0 = load i32, i32* %arrayidx1, align 4 258 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 259 store i32 %0, i32* %B.addr.01, align 4 260 %inc = add i64 %i.02, 1 261 %exitcond = icmp ne i64 %inc, 18 262 br i1 %exitcond, label %for.body, label %for.end 263 264 for.end: ; preds = %for.body 265 ret void 266 } 267 268 269 ;; for (long unsigned i = 0; i <= 18; i++) { 270 ;; A[6*i] = i; 271 ;; *B++ = A[i + 60]; 272 273 define void @exact7(i32* %A, i32* %B) nounwind uwtable ssp { 274 entry: 275 br label %for.body 276 277 ; CHECK-LABEL: exact7 278 ; CHECK: da analyze - none! 279 ; CHECK: da analyze - flow [<]! 280 ; CHECK: da analyze - confused! 281 ; CHECK: da analyze - none! 282 ; CHECK: da analyze - confused! 283 ; CHECK: da analyze - none! 284 285 for.body: ; preds = %entry, %for.body 286 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 287 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 288 %conv = trunc i64 %i.02 to i32 289 %mul = mul i64 %i.02, 6 290 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 291 store i32 %conv, i32* %arrayidx, align 4 292 %add = add i64 %i.02, 60 293 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %add 294 %0 = load i32, i32* %arrayidx1, align 4 295 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 296 store i32 %0, i32* %B.addr.01, align 4 297 %inc = add i64 %i.02, 1 298 %exitcond = icmp ne i64 %inc, 19 299 br i1 %exitcond, label %for.body, label %for.end 300 301 for.end: ; preds = %for.body 302 ret void 303 } 304 305 306 ;; for (long unsigned i = 0; i < 10; i++) { 307 ;; A[-6*i] = i; 308 ;; *B++ = A[-i - 60]; 309 310 define void @exact8(i32* %A, i32* %B) nounwind uwtable ssp { 311 entry: 312 br label %for.body 313 314 ; CHECK-LABEL: exact8 315 ; CHECK: da analyze - none! 316 ; CHECK: da analyze - none! 317 ; CHECK: da analyze - confused! 318 ; CHECK: da analyze - none! 319 ; CHECK: da analyze - confused! 320 ; CHECK: da analyze - none! 321 322 for.body: ; preds = %entry, %for.body 323 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 324 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 325 %conv = trunc i64 %i.02 to i32 326 %mul = mul i64 %i.02, -6 327 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 328 store i32 %conv, i32* %arrayidx, align 4 329 %sub1 = sub i64 -60, %i.02 330 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 331 %0 = load i32, i32* %arrayidx2, align 4 332 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 333 store i32 %0, i32* %B.addr.01, align 4 334 %inc = add i64 %i.02, 1 335 %exitcond = icmp ne i64 %inc, 10 336 br i1 %exitcond, label %for.body, label %for.end 337 338 for.end: ; preds = %for.body 339 ret void 340 } 341 342 343 ;; for (long unsigned i = 0; i <= 10; i++) { 344 ;; A[-6*i] = i; 345 ;; *B++ = A[-i - 60]; 346 347 define void @exact9(i32* %A, i32* %B) nounwind uwtable ssp { 348 entry: 349 br label %for.body 350 351 ; CHECK-LABEL: exact9 352 ; CHECK: da analyze - none! 353 ; CHECK: da analyze - flow [<]! 354 ; CHECK: da analyze - confused! 355 ; CHECK: da analyze - none! 356 ; CHECK: da analyze - confused! 357 ; CHECK: da analyze - none! 358 359 for.body: ; preds = %entry, %for.body 360 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 361 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 362 %conv = trunc i64 %i.02 to i32 363 %mul = mul i64 %i.02, -6 364 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 365 store i32 %conv, i32* %arrayidx, align 4 366 %sub1 = sub i64 -60, %i.02 367 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 368 %0 = load i32, i32* %arrayidx2, align 4 369 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 370 store i32 %0, i32* %B.addr.01, align 4 371 %inc = add i64 %i.02, 1 372 %exitcond = icmp ne i64 %inc, 11 373 br i1 %exitcond, label %for.body, label %for.end 374 375 for.end: ; preds = %for.body 376 ret void 377 } 378 379 380 ;; for (long unsigned i = 0; i < 12; i++) { 381 ;; A[-6*i] = i; 382 ;; *B++ = A[-i - 60]; 383 384 define void @exact10(i32* %A, i32* %B) nounwind uwtable ssp { 385 entry: 386 br label %for.body 387 388 ; CHECK-LABEL: exact10 389 ; CHECK: da analyze - none! 390 ; CHECK: da analyze - flow [<]! 391 ; CHECK: da analyze - confused! 392 ; CHECK: da analyze - none! 393 ; CHECK: da analyze - confused! 394 ; CHECK: da analyze - none! 395 396 for.body: ; preds = %entry, %for.body 397 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 398 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 399 %conv = trunc i64 %i.02 to i32 400 %mul = mul i64 %i.02, -6 401 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 402 store i32 %conv, i32* %arrayidx, align 4 403 %sub1 = sub i64 -60, %i.02 404 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 405 %0 = load i32, i32* %arrayidx2, align 4 406 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 407 store i32 %0, i32* %B.addr.01, align 4 408 %inc = add i64 %i.02, 1 409 %exitcond = icmp ne i64 %inc, 12 410 br i1 %exitcond, label %for.body, label %for.end 411 412 for.end: ; preds = %for.body 413 ret void 414 } 415 416 417 ;; for (long unsigned i = 0; i <= 12; i++) { 418 ;; A[-6*i] = i; 419 ;; *B++ = A[-i - 60]; 420 421 define void @exact11(i32* %A, i32* %B) nounwind uwtable ssp { 422 entry: 423 br label %for.body 424 425 ; CHECK-LABEL: exact11 426 ; CHECK: da analyze - none! 427 ; CHECK: da analyze - flow [<]! 428 ; CHECK: da analyze - confused! 429 ; CHECK: da analyze - none! 430 ; CHECK: da analyze - confused! 431 ; CHECK: da analyze - none! 432 433 for.body: ; preds = %entry, %for.body 434 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 435 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 436 %conv = trunc i64 %i.02 to i32 437 %mul = mul i64 %i.02, -6 438 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 439 store i32 %conv, i32* %arrayidx, align 4 440 %sub1 = sub i64 -60, %i.02 441 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 442 %0 = load i32, i32* %arrayidx2, align 4 443 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 444 store i32 %0, i32* %B.addr.01, align 4 445 %inc = add i64 %i.02, 1 446 %exitcond = icmp ne i64 %inc, 13 447 br i1 %exitcond, label %for.body, label %for.end 448 449 for.end: ; preds = %for.body 450 ret void 451 } 452 453 454 ;; for (long unsigned i = 0; i < 18; i++) { 455 ;; A[-6*i] = i; 456 ;; *B++ = A[-i - 60]; 457 458 define void @exact12(i32* %A, i32* %B) nounwind uwtable ssp { 459 entry: 460 br label %for.body 461 462 ; CHECK-LABEL: exact12 463 ; CHECK: da analyze - none! 464 ; CHECK: da analyze - flow [<]! 465 ; CHECK: da analyze - confused! 466 ; CHECK: da analyze - none! 467 ; CHECK: da analyze - confused! 468 ; CHECK: da analyze - none! 469 470 for.body: ; preds = %entry, %for.body 471 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 472 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 473 %conv = trunc i64 %i.02 to i32 474 %mul = mul i64 %i.02, -6 475 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 476 store i32 %conv, i32* %arrayidx, align 4 477 %sub1 = sub i64 -60, %i.02 478 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 479 %0 = load i32, i32* %arrayidx2, align 4 480 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 481 store i32 %0, i32* %B.addr.01, align 4 482 %inc = add i64 %i.02, 1 483 %exitcond = icmp ne i64 %inc, 18 484 br i1 %exitcond, label %for.body, label %for.end 485 486 for.end: ; preds = %for.body 487 ret void 488 } 489 490 491 ;; for (long unsigned i = 0; i <= 18; i++) { 492 ;; A[-6*i] = i; 493 ;; *B++ = A[-i - 60]; 494 495 define void @exact13(i32* %A, i32* %B) nounwind uwtable ssp { 496 entry: 497 br label %for.body 498 499 ; CHECK-LABEL: exact13 500 ; CHECK: da analyze - none! 501 ; CHECK: da analyze - flow [<]! 502 ; CHECK: da analyze - confused! 503 ; CHECK: da analyze - none! 504 ; CHECK: da analyze - confused! 505 ; CHECK: da analyze - none! 506 507 for.body: ; preds = %entry, %for.body 508 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 509 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 510 %conv = trunc i64 %i.02 to i32 511 %mul = mul i64 %i.02, -6 512 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 513 store i32 %conv, i32* %arrayidx, align 4 514 %sub1 = sub i64 -60, %i.02 515 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub1 516 %0 = load i32, i32* %arrayidx2, align 4 517 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 518 store i32 %0, i32* %B.addr.01, align 4 519 %inc = add i64 %i.02, 1 520 %exitcond = icmp ne i64 %inc, 19 521 br i1 %exitcond, label %for.body, label %for.end 522 523 for.end: ; preds = %for.body 524 ret void 525 } 526