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 (int i = 0; i < n; i++) { 8 ;; A[i + 2] = i; 9 ;; *B++ = A[i]; 10 11 define void @strong0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 12 entry: 13 %cmp1 = icmp sgt i64 %n, 0 14 br i1 %cmp1, label %for.body.preheader, label %for.end 15 16 ; CHECK: da analyze - none! 17 ; CHECK: da analyze - consistent flow [2]! 18 ; CHECK: da analyze - confused! 19 ; CHECK: da analyze - none! 20 ; CHECK: da analyze - confused! 21 ; CHECK: da analyze - none! 22 23 for.body.preheader: ; preds = %entry 24 br label %for.body 25 26 for.body: ; preds = %for.body.preheader, %for.body 27 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 28 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 29 %0 = add nsw i64 %indvars.iv, 2 30 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %0 31 %1 = trunc i64 %indvars.iv to i32 32 store i32 %1, i32* %arrayidx, align 4 33 %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 34 %2 = load i32, i32* %arrayidx3, align 4 35 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 36 store i32 %2, i32* %B.addr.02, align 4 37 %indvars.iv.next = add i64 %indvars.iv, 1 38 %exitcond = icmp ne i64 %indvars.iv.next, %n 39 br i1 %exitcond, label %for.body, label %for.end.loopexit 40 41 for.end.loopexit: ; preds = %for.body 42 br label %for.end 43 44 for.end: ; preds = %for.end.loopexit, %entry 45 ret void 46 } 47 48 49 ;; for (long int i = 0; i < n; i++) { 50 ;; A[i + 2] = i; 51 ;; *B++ = A[i]; 52 53 define void @strong1(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { 54 entry: 55 %cmp1 = icmp sgt i32 %n, 0 56 br i1 %cmp1, label %for.body.preheader, label %for.end 57 58 ; CHECK: da analyze - none! 59 ; CHECK: da analyze - consistent flow [2]! 60 ; CHECK: da analyze - confused! 61 ; CHECK: da analyze - none! 62 ; CHECK: da analyze - confused! 63 ; CHECK: da analyze - none! 64 65 for.body.preheader: ; preds = %entry 66 %0 = sext i32 %n to i64 67 br label %for.body 68 69 for.body: ; preds = %for.body.preheader, %for.body 70 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 71 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 72 %conv2 = trunc i64 %i.03 to i32 73 %add = add nsw i64 %i.03, 2 74 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 75 store i32 %conv2, i32* %arrayidx, align 4 76 %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %i.03 77 %1 = load i32, i32* %arrayidx3, align 4 78 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 79 store i32 %1, i32* %B.addr.02, align 4 80 %inc = add nsw i64 %i.03, 1 81 %exitcond = icmp ne i64 %inc, %0 82 br i1 %exitcond, label %for.body, label %for.end.loopexit 83 84 for.end.loopexit: ; preds = %for.body 85 br label %for.end 86 87 for.end: ; preds = %for.end.loopexit, %entry 88 ret void 89 } 90 91 92 ;; for (long unsigned i = 0; i < n; i++) { 93 ;; A[i + 2] = i; 94 ;; *B++ = A[i]; 95 96 define void @strong2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 97 entry: 98 %cmp1 = icmp eq i64 %n, 0 99 br i1 %cmp1, label %for.end, label %for.body.preheader 100 101 ; CHECK: da analyze - none! 102 ; CHECK: da analyze - consistent flow [2]! 103 ; CHECK: da analyze - confused! 104 ; CHECK: da analyze - none! 105 ; CHECK: da analyze - confused! 106 ; CHECK: da analyze - none! 107 108 for.body.preheader: ; preds = %entry 109 br label %for.body 110 111 for.body: ; preds = %for.body.preheader, %for.body 112 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 113 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 114 %conv = trunc i64 %i.03 to i32 115 %add = add i64 %i.03, 2 116 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 117 store i32 %conv, i32* %arrayidx, align 4 118 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.03 119 %0 = load i32, i32* %arrayidx1, align 4 120 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 121 store i32 %0, i32* %B.addr.02, align 4 122 %inc = add i64 %i.03, 1 123 %exitcond = icmp ne i64 %inc, %n 124 br i1 %exitcond, label %for.body, label %for.end.loopexit 125 126 for.end.loopexit: ; preds = %for.body 127 br label %for.end 128 129 for.end: ; preds = %for.end.loopexit, %entry 130 ret void 131 } 132 133 134 ;; for (int i = 0; i < n; i++) { 135 ;; A[i + 2] = i; 136 ;; *B++ = A[i]; 137 138 define void @strong3(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { 139 entry: 140 %cmp1 = icmp sgt i32 %n, 0 141 br i1 %cmp1, label %for.body.preheader, label %for.end 142 143 ; CHECK: da analyze - none! 144 ; CHECK: da analyze - consistent flow [2]! 145 ; CHECK: da analyze - confused! 146 ; CHECK: da analyze - none! 147 ; CHECK: da analyze - confused! 148 ; CHECK: da analyze - none! 149 150 for.body.preheader: ; preds = %entry 151 br label %for.body 152 153 for.body: ; preds = %for.body.preheader, %for.body 154 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 155 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 156 %0 = add nsw i64 %indvars.iv, 2 157 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %0 158 %1 = trunc i64 %indvars.iv to i32 159 store i32 %1, i32* %arrayidx, align 4 160 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 161 %2 = load i32, i32* %arrayidx2, align 4 162 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 163 store i32 %2, i32* %B.addr.02, align 4 164 %indvars.iv.next = add i64 %indvars.iv, 1 165 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 166 %exitcond = icmp ne i32 %lftr.wideiv, %n 167 br i1 %exitcond, label %for.body, label %for.end.loopexit 168 169 for.end.loopexit: ; preds = %for.body 170 br label %for.end 171 172 for.end: ; preds = %for.end.loopexit, %entry 173 ret void 174 } 175 176 177 ;; for (long unsigned i = 0; i < 19; i++) { 178 ;; A[i + 19] = i; 179 ;; *B++ = A[i]; 180 181 define void @strong4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 182 entry: 183 br label %for.body 184 185 ; CHECK: da analyze - none! 186 ; CHECK: da analyze - none! 187 ; CHECK: da analyze - confused! 188 ; CHECK: da analyze - none! 189 ; CHECK: da analyze - confused! 190 ; CHECK: da analyze - none! 191 192 for.body: ; preds = %entry, %for.body 193 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 194 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 195 %conv = trunc i64 %i.02 to i32 196 %add = add i64 %i.02, 19 197 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 198 store i32 %conv, i32* %arrayidx, align 4 199 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02 200 %0 = load i32, i32* %arrayidx1, align 4 201 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 202 store i32 %0, i32* %B.addr.01, align 4 203 %inc = add i64 %i.02, 1 204 %exitcond = icmp ne i64 %inc, 19 205 br i1 %exitcond, label %for.body, label %for.end 206 207 for.end: ; preds = %for.body 208 ret void 209 } 210 211 212 ;; for (long unsigned i = 0; i < 20; i++) { 213 ;; A[i + 19] = i; 214 ;; *B++ = A[i]; 215 216 define void @strong5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 217 entry: 218 br label %for.body 219 220 ; CHECK: da analyze - none! 221 ; CHECK: da analyze - consistent flow [19]! 222 ; CHECK: da analyze - confused! 223 ; CHECK: da analyze - none! 224 ; CHECK: da analyze - confused! 225 ; CHECK: da analyze - none! 226 227 for.body: ; preds = %entry, %for.body 228 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 229 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 230 %conv = trunc i64 %i.02 to i32 231 %add = add i64 %i.02, 19 232 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 233 store i32 %conv, i32* %arrayidx, align 4 234 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02 235 %0 = load i32, i32* %arrayidx1, align 4 236 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 237 store i32 %0, i32* %B.addr.01, align 4 238 %inc = add i64 %i.02, 1 239 %exitcond = icmp ne i64 %inc, 20 240 br i1 %exitcond, label %for.body, label %for.end 241 242 for.end: ; preds = %for.body 243 ret void 244 } 245 246 247 ;; for (long unsigned i = 0; i < 20; i++) { 248 ;; A[2*i + 6] = i; 249 ;; *B++ = A[2*i]; 250 251 define void @strong6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 252 entry: 253 br label %for.body 254 255 ; CHECK: da analyze - none! 256 ; CHECK: da analyze - consistent flow [3]! 257 ; CHECK: da analyze - confused! 258 ; CHECK: da analyze - none! 259 ; CHECK: da analyze - confused! 260 ; CHECK: da analyze - none! 261 262 for.body: ; preds = %entry, %for.body 263 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 264 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 265 %conv = trunc i64 %i.02 to i32 266 %mul = shl i64 %i.02, 1 267 %add = add i64 %mul, 6 268 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 269 store i32 %conv, i32* %arrayidx, align 4 270 %mul1 = shl i64 %i.02, 1 271 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %mul1 272 %0 = load i32, i32* %arrayidx2, align 4 273 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 274 store i32 %0, i32* %B.addr.01, align 4 275 %inc = add i64 %i.02, 1 276 %exitcond = icmp ne i64 %inc, 20 277 br i1 %exitcond, label %for.body, label %for.end 278 279 for.end: ; preds = %for.body 280 ret void 281 } 282 283 284 ;; for (long unsigned i = 0; i < 20; i++) { 285 ;; A[2*i + 7] = i; 286 ;; *B++ = A[2*i]; 287 288 define void @strong7(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 289 entry: 290 br label %for.body 291 292 ; CHECK: da analyze - none! 293 ; CHECK: da analyze - none! 294 ; CHECK: da analyze - confused! 295 ; CHECK: da analyze - none! 296 ; CHECK: da analyze - confused! 297 ; CHECK: da analyze - none! 298 299 for.body: ; preds = %entry, %for.body 300 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 301 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 302 %conv = trunc i64 %i.02 to i32 303 %mul = shl i64 %i.02, 1 304 %add = add i64 %mul, 7 305 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 306 store i32 %conv, i32* %arrayidx, align 4 307 %mul1 = shl i64 %i.02, 1 308 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %mul1 309 %0 = load i32, i32* %arrayidx2, align 4 310 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 311 store i32 %0, i32* %B.addr.01, align 4 312 %inc = add i64 %i.02, 1 313 %exitcond = icmp ne i64 %inc, 20 314 br i1 %exitcond, label %for.body, label %for.end 315 316 for.end: ; preds = %for.body 317 ret void 318 } 319 320 321 ;; for (long unsigned i = 0; i < 20; i++) { 322 ;; A[i + n] = i; 323 ;; *B++ = A[i]; 324 325 define void @strong8(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 326 entry: 327 br label %for.body 328 329 ; CHECK: da analyze - none! 330 ; CHECK: da analyze - flow [*|<]! 331 ; CHECK: da analyze - confused! 332 ; CHECK: da analyze - none! 333 ; CHECK: da analyze - confused! 334 ; CHECK: da analyze - none! 335 336 for.body: ; preds = %entry, %for.body 337 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 338 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 339 %conv = trunc i64 %i.02 to i32 340 %add = add i64 %i.02, %n 341 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 342 store i32 %conv, i32* %arrayidx, align 4 343 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02 344 %0 = load i32, i32* %arrayidx1, align 4 345 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 346 store i32 %0, i32* %B.addr.01, align 4 347 %inc = add i64 %i.02, 1 348 %exitcond = icmp ne i64 %inc, 20 349 br i1 %exitcond, label %for.body, label %for.end 350 351 for.end: ; preds = %for.body 352 ret void 353 } 354 355 356 ;; for (long unsigned i = 0; i < n; i++) { 357 ;; A[i + n] = i; 358 ;; *B++ = A[i + 2*n]; 359 360 define void @strong9(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 361 entry: 362 %cmp1 = icmp eq i64 %n, 0 363 br i1 %cmp1, label %for.end, label %for.body.preheader 364 365 ; CHECK: da analyze - none! 366 ; CHECK: da analyze - none! 367 ; CHECK: da analyze - confused! 368 ; CHECK: da analyze - none! 369 ; CHECK: da analyze - confused! 370 ; CHECK: da analyze - none! 371 372 for.body.preheader: ; preds = %entry 373 br label %for.body 374 375 for.body: ; preds = %for.body.preheader, %for.body 376 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 377 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 378 %conv = trunc i64 %i.03 to i32 379 %add = add i64 %i.03, %n 380 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 381 store i32 %conv, i32* %arrayidx, align 4 382 %mul = shl i64 %n, 1 383 %add1 = add i64 %i.03, %mul 384 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add1 385 %0 = load i32, i32* %arrayidx2, align 4 386 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 387 store i32 %0, i32* %B.addr.02, align 4 388 %inc = add i64 %i.03, 1 389 %exitcond = icmp ne i64 %inc, %n 390 br i1 %exitcond, label %for.body, label %for.end.loopexit 391 392 for.end.loopexit: ; preds = %for.body 393 br label %for.end 394 395 for.end: ; preds = %for.end.loopexit, %entry 396 ret void 397 } 398 399 400 ;; for (long unsigned i = 0; i < 1000; i++) { 401 ;; A[n*i + 5] = i; 402 ;; *B++ = A[n*i + 5]; 403 404 define void @strong10(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 405 entry: 406 br label %for.body 407 408 ; CHECK: da analyze - none! 409 ; CHECK: da analyze - consistent flow [0|<]! 410 ; CHECK: da analyze - confused! 411 ; CHECK: da analyze - none! 412 ; CHECK: da analyze - confused! 413 ; CHECK: da analyze - none! 414 415 for.body: ; preds = %entry, %for.body 416 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 417 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 418 %conv = trunc i64 %i.02 to i32 419 %mul = mul i64 %i.02, %n 420 %add = add i64 %mul, 5 421 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 422 store i32 %conv, i32* %arrayidx, align 4 423 %mul1 = mul i64 %i.02, %n 424 %add2 = add i64 %mul1, 5 425 %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add2 426 %0 = load i32, i32* %arrayidx3, align 4 427 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 428 store i32 %0, i32* %B.addr.01, align 4 429 %inc = add i64 %i.02, 1 430 %exitcond = icmp ne i64 %inc, 1000 431 br i1 %exitcond, label %for.body, label %for.end 432 433 for.end: ; preds = %for.body 434 ret void 435 } 436