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