1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s 2 3 ; ModuleID = 'ExactRDIV.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 int i = 0; i < 10; i++) 9 ;; A[4*i + 10] = i; 10 ;; for (long int j = 0; j < 10; j++) 11 ;; *B++ = A[2*j + 1]; 12 13 define void @rdiv0(i32* %A, i32* %B) nounwind uwtable ssp { 14 entry: 15 br label %for.body 16 17 ; CHECK: da analyze - none! 18 ; CHECK: da analyze - none! 19 ; CHECK: da analyze - confused! 20 ; CHECK: da analyze - none! 21 ; CHECK: da analyze - confused! 22 ; CHECK: da analyze - none! 23 24 for.body: ; preds = %entry, %for.body 25 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 26 %conv = trunc i64 %i.03 to i32 27 %mul = shl nsw i64 %i.03, 2 28 %add = add nsw i64 %mul, 10 29 %arrayidx = getelementptr inbounds i32* %A, i64 %add 30 store i32 %conv, i32* %arrayidx, align 4 31 %inc = add nsw i64 %i.03, 1 32 %exitcond5 = icmp ne i64 %inc, 10 33 br i1 %exitcond5, label %for.body, label %for.body4.preheader 34 35 for.body4.preheader: ; preds = %for.body 36 br label %for.body4 37 38 for.body4: ; preds = %for.body4.preheader, %for.body4 39 %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] 40 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 41 %mul5 = shl nsw i64 %j.02, 1 42 %add64 = or i64 %mul5, 1 43 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add64 44 %0 = load i32* %arrayidx7, align 4 45 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 46 store i32 %0, i32* %B.addr.01, align 4 47 %inc9 = add nsw i64 %j.02, 1 48 %exitcond = icmp ne i64 %inc9, 10 49 br i1 %exitcond, label %for.body4, label %for.end10 50 51 for.end10: ; preds = %for.body4 52 ret void 53 } 54 55 56 ;; for (long int i = 0; i < 5; i++) 57 ;; A[11*i - 45] = i; 58 ;; for (long int j = 0; j < 10; j++) 59 ;; *B++ = A[j]; 60 61 define void @rdiv1(i32* %A, i32* %B) nounwind uwtable ssp { 62 entry: 63 br label %for.body 64 65 ; CHECK: da analyze - none! 66 ; CHECK: da analyze - none! 67 ; CHECK: da analyze - confused! 68 ; CHECK: da analyze - none! 69 ; CHECK: da analyze - confused! 70 ; CHECK: da analyze - none! 71 72 for.body: ; preds = %entry, %for.body 73 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 74 %conv = trunc i64 %i.03 to i32 75 %mul = mul nsw i64 %i.03, 11 76 %sub = add nsw i64 %mul, -45 77 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 78 store i32 %conv, i32* %arrayidx, align 4 79 %inc = add nsw i64 %i.03, 1 80 %exitcond4 = icmp ne i64 %inc, 5 81 br i1 %exitcond4, label %for.body, label %for.body4.preheader 82 83 for.body4.preheader: ; preds = %for.body 84 br label %for.body4 85 86 for.body4: ; preds = %for.body4.preheader, %for.body4 87 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 88 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 89 %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 90 %0 = load i32* %arrayidx5, align 4 91 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 92 store i32 %0, i32* %B.addr.01, align 4 93 %inc7 = add nsw i64 %j.02, 1 94 %exitcond = icmp ne i64 %inc7, 10 95 br i1 %exitcond, label %for.body4, label %for.end8 96 97 for.end8: ; preds = %for.body4 98 ret void 99 } 100 101 102 ;; for (long int i = 0; i <= 5; i++) 103 ;; A[11*i - 45] = i; 104 ;; for (long int j = 0; j < 10; j++) 105 ;; *B++ = A[j]; 106 107 define void @rdiv2(i32* %A, i32* %B) nounwind uwtable ssp { 108 entry: 109 br label %for.body 110 111 ; CHECK: da analyze - none! 112 ; CHECK: da analyze - none! 113 ; CHECK: da analyze - confused! 114 ; CHECK: da analyze - none! 115 ; CHECK: da analyze - confused! 116 ; CHECK: da analyze - none! 117 118 for.body: ; preds = %entry, %for.body 119 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 120 %conv = trunc i64 %i.03 to i32 121 %mul = mul nsw i64 %i.03, 11 122 %sub = add nsw i64 %mul, -45 123 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 124 store i32 %conv, i32* %arrayidx, align 4 125 %inc = add nsw i64 %i.03, 1 126 %exitcond4 = icmp ne i64 %inc, 6 127 br i1 %exitcond4, label %for.body, label %for.body4.preheader 128 129 for.body4.preheader: ; preds = %for.body 130 br label %for.body4 131 132 for.body4: ; preds = %for.body4.preheader, %for.body4 133 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 134 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 135 %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 136 %0 = load i32* %arrayidx5, align 4 137 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 138 store i32 %0, i32* %B.addr.01, align 4 139 %inc7 = add nsw i64 %j.02, 1 140 %exitcond = icmp ne i64 %inc7, 10 141 br i1 %exitcond, label %for.body4, label %for.end8 142 143 for.end8: ; preds = %for.body4 144 ret void 145 } 146 147 148 ;; for (long int i = 0; i < 5; i++) 149 ;; A[11*i - 45] = i; 150 ;; for (long int j = 0; j <= 10; j++) 151 ;; *B++ = A[j]; 152 153 define void @rdiv3(i32* %A, i32* %B) nounwind uwtable ssp { 154 entry: 155 br label %for.body 156 157 ; CHECK: da analyze - none! 158 ; CHECK: da analyze - none! 159 ; CHECK: da analyze - confused! 160 ; CHECK: da analyze - none! 161 ; CHECK: da analyze - confused! 162 ; CHECK: da analyze - none! 163 164 for.body: ; preds = %entry, %for.body 165 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 166 %conv = trunc i64 %i.03 to i32 167 %mul = mul nsw i64 %i.03, 11 168 %sub = add nsw i64 %mul, -45 169 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 170 store i32 %conv, i32* %arrayidx, align 4 171 %inc = add nsw i64 %i.03, 1 172 %exitcond4 = icmp ne i64 %inc, 5 173 br i1 %exitcond4, label %for.body, label %for.body4.preheader 174 175 for.body4.preheader: ; preds = %for.body 176 br label %for.body4 177 178 for.body4: ; preds = %for.body4.preheader, %for.body4 179 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 180 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 181 %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 182 %0 = load i32* %arrayidx5, align 4 183 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 184 store i32 %0, i32* %B.addr.01, align 4 185 %inc7 = add nsw i64 %j.02, 1 186 %exitcond = icmp ne i64 %inc7, 11 187 br i1 %exitcond, label %for.body4, label %for.end8 188 189 for.end8: ; preds = %for.body4 190 ret void 191 } 192 193 194 ;; for (long int i = 0; i <= 5; i++) 195 ;; A[11*i - 45] = i; 196 ;; for (long int j = 0; j <= 10; j++) 197 ;; *B++ = A[j]; 198 199 define void @rdiv4(i32* %A, i32* %B) nounwind uwtable ssp { 200 entry: 201 br label %for.body 202 203 ; CHECK: da analyze - none! 204 ; CHECK: da analyze - flow [|<]! 205 ; CHECK: da analyze - confused! 206 ; CHECK: da analyze - none! 207 ; CHECK: da analyze - confused! 208 ; CHECK: da analyze - none! 209 210 for.body: ; preds = %entry, %for.body 211 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 212 %conv = trunc i64 %i.03 to i32 213 %mul = mul nsw i64 %i.03, 11 214 %sub = add nsw i64 %mul, -45 215 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 216 store i32 %conv, i32* %arrayidx, align 4 217 %inc = add nsw i64 %i.03, 1 218 %exitcond4 = icmp ne i64 %inc, 6 219 br i1 %exitcond4, label %for.body, label %for.body4.preheader 220 221 for.body4.preheader: ; preds = %for.body 222 br label %for.body4 223 224 for.body4: ; preds = %for.body4.preheader, %for.body4 225 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 226 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 227 %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 228 %0 = load i32* %arrayidx5, align 4 229 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 230 store i32 %0, i32* %B.addr.01, align 4 231 %inc7 = add nsw i64 %j.02, 1 232 %exitcond = icmp ne i64 %inc7, 11 233 br i1 %exitcond, label %for.body4, label %for.end8 234 235 for.end8: ; preds = %for.body4 236 ret void 237 } 238 239 240 ;; for (long int i = 0; i < 5; i++) 241 ;; A[-11*i + 45] = i; 242 ;; for (long int j = 0; j < 10; j++) 243 ;; *B++ = A[-j]; 244 245 define void @rdiv5(i32* %A, i32* %B) nounwind uwtable ssp { 246 entry: 247 br label %for.body 248 249 ; CHECK: da analyze - none! 250 ; CHECK: da analyze - none! 251 ; CHECK: da analyze - confused! 252 ; CHECK: da analyze - none! 253 ; CHECK: da analyze - confused! 254 ; CHECK: da analyze - none! 255 256 for.body: ; preds = %entry, %for.body 257 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 258 %conv = trunc i64 %i.03 to i32 259 %mul = mul nsw i64 %i.03, -11 260 %add = add nsw i64 %mul, 45 261 %arrayidx = getelementptr inbounds i32* %A, i64 %add 262 store i32 %conv, i32* %arrayidx, align 4 263 %inc = add nsw i64 %i.03, 1 264 %exitcond4 = icmp ne i64 %inc, 5 265 br i1 %exitcond4, label %for.body, label %for.body4.preheader 266 267 for.body4.preheader: ; preds = %for.body 268 br label %for.body4 269 270 for.body4: ; preds = %for.body4.preheader, %for.body4 271 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 272 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 273 %sub = sub nsw i64 0, %j.02 274 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub 275 %0 = load i32* %arrayidx5, align 4 276 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 277 store i32 %0, i32* %B.addr.01, align 4 278 %inc7 = add nsw i64 %j.02, 1 279 %exitcond = icmp ne i64 %inc7, 10 280 br i1 %exitcond, label %for.body4, label %for.end8 281 282 for.end8: ; preds = %for.body4 283 ret void 284 } 285 286 287 ;; for (long int i = 0; i <= 5; i++) 288 ;; A[-11*i + 45] = i; 289 ;; for (long int j = 0; j < 10; j++) 290 ;; *B++ = A[-j]; 291 292 define void @rdiv6(i32* %A, i32* %B) nounwind uwtable ssp { 293 entry: 294 br label %for.body 295 296 ; CHECK: da analyze - none! 297 ; CHECK: da analyze - none! 298 ; CHECK: da analyze - confused! 299 ; CHECK: da analyze - none! 300 ; CHECK: da analyze - confused! 301 ; CHECK: da analyze - none! 302 303 for.body: ; preds = %entry, %for.body 304 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 305 %conv = trunc i64 %i.03 to i32 306 %mul = mul nsw i64 %i.03, -11 307 %add = add nsw i64 %mul, 45 308 %arrayidx = getelementptr inbounds i32* %A, i64 %add 309 store i32 %conv, i32* %arrayidx, align 4 310 %inc = add nsw i64 %i.03, 1 311 %exitcond4 = icmp ne i64 %inc, 6 312 br i1 %exitcond4, label %for.body, label %for.body4.preheader 313 314 for.body4.preheader: ; preds = %for.body 315 br label %for.body4 316 317 for.body4: ; preds = %for.body4.preheader, %for.body4 318 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 319 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 320 %sub = sub nsw i64 0, %j.02 321 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub 322 %0 = load i32* %arrayidx5, align 4 323 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 324 store i32 %0, i32* %B.addr.01, align 4 325 %inc7 = add nsw i64 %j.02, 1 326 %exitcond = icmp ne i64 %inc7, 10 327 br i1 %exitcond, label %for.body4, label %for.end8 328 329 for.end8: ; preds = %for.body4 330 ret void 331 } 332 333 334 ;; for (long int i = 0; i < 5; i++) 335 ;; A[-11*i + 45] = i; 336 ;; for (long int j = 0; j <= 10; j++) 337 ;; *B++ = A[-j]; 338 339 define void @rdiv7(i32* %A, i32* %B) nounwind uwtable ssp { 340 entry: 341 br label %for.body 342 343 ; CHECK: da analyze - none! 344 ; CHECK: da analyze - none! 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.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 352 %conv = trunc i64 %i.03 to i32 353 %mul = mul nsw i64 %i.03, -11 354 %add = add nsw i64 %mul, 45 355 %arrayidx = getelementptr inbounds i32* %A, i64 %add 356 store i32 %conv, i32* %arrayidx, align 4 357 %inc = add nsw i64 %i.03, 1 358 %exitcond4 = icmp ne i64 %inc, 5 359 br i1 %exitcond4, label %for.body, label %for.body4.preheader 360 361 for.body4.preheader: ; preds = %for.body 362 br label %for.body4 363 364 for.body4: ; preds = %for.body4.preheader, %for.body4 365 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 366 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 367 %sub = sub nsw i64 0, %j.02 368 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub 369 %0 = load i32* %arrayidx5, align 4 370 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 371 store i32 %0, i32* %B.addr.01, align 4 372 %inc7 = add nsw i64 %j.02, 1 373 %exitcond = icmp ne i64 %inc7, 11 374 br i1 %exitcond, label %for.body4, label %for.end8 375 376 for.end8: ; preds = %for.body4 377 ret void 378 } 379 380 381 ;; for (long int i = 0; i <= 5; i++) 382 ;; A[-11*i + 45] = i; 383 ;; for (long int j = 0; j <= 10; j++) 384 ;; *B++ = A[-j]; 385 386 define void @rdiv8(i32* %A, i32* %B) nounwind uwtable ssp { 387 entry: 388 br label %for.body 389 390 ; CHECK: da analyze - none! 391 ; CHECK: da analyze - flow [|<]! 392 ; CHECK: da analyze - confused! 393 ; CHECK: da analyze - none! 394 ; CHECK: da analyze - confused! 395 ; CHECK: da analyze - none! 396 397 for.body: ; preds = %entry, %for.body 398 %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 399 %conv = trunc i64 %i.03 to i32 400 %mul = mul nsw i64 %i.03, -11 401 %add = add nsw i64 %mul, 45 402 %arrayidx = getelementptr inbounds i32* %A, i64 %add 403 store i32 %conv, i32* %arrayidx, align 4 404 %inc = add nsw i64 %i.03, 1 405 %exitcond4 = icmp ne i64 %inc, 6 406 br i1 %exitcond4, label %for.body, label %for.body4.preheader 407 408 for.body4.preheader: ; preds = %for.body 409 br label %for.body4 410 411 for.body4: ; preds = %for.body4.preheader, %for.body4 412 %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] 413 %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] 414 %sub = sub nsw i64 0, %j.02 415 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub 416 %0 = load i32* %arrayidx5, align 4 417 %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 418 store i32 %0, i32* %B.addr.01, align 4 419 %inc7 = add nsw i64 %j.02, 1 420 %exitcond = icmp ne i64 %inc7, 11 421 br i1 %exitcond, label %for.body4, label %for.end8 422 423 for.end8: ; preds = %for.body4 424 ret void 425 } 426 427 428 ;; for (long int i = 0; i < 5; i++) 429 ;; for (long int j = 0; j < 10; j++) { 430 ;; A[11*i - j] = i; 431 ;; *B++ = A[45]; 432 433 define void @rdiv9(i32* %A, i32* %B) nounwind uwtable ssp { 434 entry: 435 br label %for.cond1.preheader 436 437 ; CHECK: da analyze - none! 438 ; CHECK: da analyze - none! 439 ; CHECK: da analyze - confused! 440 ; CHECK: da analyze - consistent input [S S]! 441 ; CHECK: da analyze - confused! 442 ; CHECK: da analyze - none! 443 444 for.cond1.preheader: ; preds = %entry, %for.inc5 445 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] 446 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 447 br label %for.body3 448 449 for.body3: ; preds = %for.cond1.preheader, %for.body3 450 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 451 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 452 %conv = trunc i64 %i.03 to i32 453 %mul = mul nsw i64 %i.03, 11 454 %sub = sub nsw i64 %mul, %j.02 455 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 456 store i32 %conv, i32* %arrayidx, align 4 457 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 458 %0 = load i32* %arrayidx4, align 4 459 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 460 store i32 %0, i32* %B.addr.11, align 4 461 %inc = add nsw i64 %j.02, 1 462 %exitcond = icmp ne i64 %inc, 10 463 br i1 %exitcond, label %for.body3, label %for.inc5 464 465 for.inc5: ; preds = %for.body3 466 %scevgep = getelementptr i32* %B.addr.04, i64 10 467 %inc6 = add nsw i64 %i.03, 1 468 %exitcond5 = icmp ne i64 %inc6, 5 469 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 470 471 for.end7: ; preds = %for.inc5 472 ret void 473 } 474 475 476 477 ;; for (long int i = 0; i <= 5; i++) 478 ;; for (long int j = 0; j < 10; j++) { 479 ;; A[11*i - j] = i; 480 ;; *B++ = A[45]; 481 482 define void @rdiv10(i32* %A, i32* %B) nounwind uwtable ssp { 483 entry: 484 br label %for.cond1.preheader 485 486 ; CHECK: da analyze - none! 487 ; CHECK: da analyze - none! 488 ; CHECK: da analyze - confused! 489 ; CHECK: da analyze - consistent input [S S]! 490 ; CHECK: da analyze - confused! 491 ; CHECK: da analyze - none! 492 493 for.cond1.preheader: ; preds = %entry, %for.inc5 494 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] 495 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 496 br label %for.body3 497 498 for.body3: ; preds = %for.cond1.preheader, %for.body3 499 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 500 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 501 %conv = trunc i64 %i.03 to i32 502 %mul = mul nsw i64 %i.03, 11 503 %sub = sub nsw i64 %mul, %j.02 504 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 505 store i32 %conv, i32* %arrayidx, align 4 506 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 507 %0 = load i32* %arrayidx4, align 4 508 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 509 store i32 %0, i32* %B.addr.11, align 4 510 %inc = add nsw i64 %j.02, 1 511 %exitcond = icmp ne i64 %inc, 10 512 br i1 %exitcond, label %for.body3, label %for.inc5 513 514 for.inc5: ; preds = %for.body3 515 %scevgep = getelementptr i32* %B.addr.04, i64 10 516 %inc6 = add nsw i64 %i.03, 1 517 %exitcond5 = icmp ne i64 %inc6, 6 518 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 519 520 for.end7: ; preds = %for.inc5 521 ret void 522 } 523 524 525 ;; for (long int i = 0; i < 5; i++) 526 ;; for (long int j = 0; j <= 10; j++) { 527 ;; A[11*i - j] = i; 528 ;; *B++ = A[45]; 529 530 define void @rdiv11(i32* %A, i32* %B) nounwind uwtable ssp { 531 entry: 532 br label %for.cond1.preheader 533 534 ; CHECK: da analyze - none! 535 ; CHECK: da analyze - none! 536 ; CHECK: da analyze - confused! 537 ; CHECK: da analyze - consistent input [S S]! 538 ; CHECK: da analyze - confused! 539 ; CHECK: da analyze - none! 540 541 for.cond1.preheader: ; preds = %entry, %for.inc5 542 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] 543 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 544 br label %for.body3 545 546 for.body3: ; preds = %for.cond1.preheader, %for.body3 547 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 548 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 549 %conv = trunc i64 %i.03 to i32 550 %mul = mul nsw i64 %i.03, 11 551 %sub = sub nsw i64 %mul, %j.02 552 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 553 store i32 %conv, i32* %arrayidx, align 4 554 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 555 %0 = load i32* %arrayidx4, align 4 556 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 557 store i32 %0, i32* %B.addr.11, align 4 558 %inc = add nsw i64 %j.02, 1 559 %exitcond = icmp ne i64 %inc, 11 560 br i1 %exitcond, label %for.body3, label %for.inc5 561 562 for.inc5: ; preds = %for.body3 563 %scevgep = getelementptr i32* %B.addr.04, i64 11 564 %inc6 = add nsw i64 %i.03, 1 565 %exitcond5 = icmp ne i64 %inc6, 5 566 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 567 568 for.end7: ; preds = %for.inc5 569 ret void 570 } 571 572 573 ;; for (long int i = 0; i <= 5; i++) 574 ;; for (long int j = 0; j <= 10; j++) { 575 ;; A[11*i - j] = i; 576 ;; *B++ = A[45]; 577 578 define void @rdiv12(i32* %A, i32* %B) nounwind uwtable ssp { 579 entry: 580 br label %for.cond1.preheader 581 582 ; CHECK: da analyze - none! 583 ; CHECK: da analyze - flow [* *|<]! 584 ; CHECK: da analyze - confused! 585 ; CHECK: da analyze - consistent input [S S]! 586 ; CHECK: da analyze - confused! 587 ; CHECK: da analyze - none! 588 589 for.cond1.preheader: ; preds = %entry, %for.inc5 590 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] 591 %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] 592 br label %for.body3 593 594 for.body3: ; preds = %for.cond1.preheader, %for.body3 595 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] 596 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] 597 %conv = trunc i64 %i.03 to i32 598 %mul = mul nsw i64 %i.03, 11 599 %sub = sub nsw i64 %mul, %j.02 600 %arrayidx = getelementptr inbounds i32* %A, i64 %sub 601 store i32 %conv, i32* %arrayidx, align 4 602 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 603 %0 = load i32* %arrayidx4, align 4 604 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 605 store i32 %0, i32* %B.addr.11, align 4 606 %inc = add nsw i64 %j.02, 1 607 %exitcond = icmp ne i64 %inc, 11 608 br i1 %exitcond, label %for.body3, label %for.inc5 609 610 for.inc5: ; preds = %for.body3 611 %scevgep = getelementptr i32* %B.addr.04, i64 11 612 %inc6 = add nsw i64 %i.03, 1 613 %exitcond5 = icmp ne i64 %inc6, 6 614 br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 615 616 for.end7: ; preds = %for.inc5 617 ret void 618 } 619