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