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