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