1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ 3; RUN: | FileCheck %s 4 5target 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" 6target triple = "x86_64-apple-macosx10.6.0" 7 8 9;; for (long int i = 0; i < n; i++) { 10;; A[2*i + n] = i; 11;; *B++ = A[3*i + 3*n]; 12 13define void @symbolicsiv0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 14; CHECK-LABEL: 'symbolicsiv0' 15; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 16; CHECK-NEXT: da analyze - none! 17; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 18; CHECK-NEXT: da analyze - none! 19; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 20; CHECK-NEXT: da analyze - confused! 21; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 22; CHECK-NEXT: da analyze - none! 23; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 24; CHECK-NEXT: da analyze - confused! 25; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 26; CHECK-NEXT: da analyze - none! 27; 28entry: 29 %cmp1 = icmp eq i64 %n, 0 30 br i1 %cmp1, label %for.end, label %for.body.preheader 31 32for.body.preheader: ; preds = %entry 33 br label %for.body 34 35for.body: ; preds = %for.body.preheader, %for.body 36 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 37 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 38 %conv = trunc i64 %i.03 to i32 39 %mul = shl nsw i64 %i.03, 1 40 %add = add i64 %mul, %n 41 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 42 store i32 %conv, ptr %arrayidx, align 4 43 %mul14 = add i64 %i.03, %n 44 %add3 = mul i64 %mul14, 3 45 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %add3 46 %0 = load i32, ptr %arrayidx4, align 4 47 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 48 store i32 %0, ptr %B.addr.02, align 4 49 %inc = add nsw i64 %i.03, 1 50 %exitcond = icmp ne i64 %inc, %n 51 br i1 %exitcond, label %for.body, label %for.end.loopexit 52 53for.end.loopexit: ; preds = %for.body 54 br label %for.end 55 56for.end: ; preds = %for.end.loopexit, %entry 57 ret void 58} 59 60 61;; for (long int i = 0; i < n; i++) { 62;; A[2*i + 5*n] = i; 63;; *B++ = A[3*i + 2*n]; 64 65define void @symbolicsiv1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 66; CHECK-LABEL: 'symbolicsiv1' 67; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 68; CHECK-NEXT: da analyze - none! 69; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 70; CHECK-NEXT: da analyze - none! 71; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 72; CHECK-NEXT: da analyze - confused! 73; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4 74; CHECK-NEXT: da analyze - none! 75; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 76; CHECK-NEXT: da analyze - confused! 77; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 78; CHECK-NEXT: da analyze - none! 79; 80entry: 81 %cmp1 = icmp eq i64 %n, 0 82 br i1 %cmp1, label %for.end, label %for.body.preheader 83 84for.body.preheader: ; preds = %entry 85 br label %for.body 86 87for.body: ; preds = %for.body.preheader, %for.body 88 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 89 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 90 %conv = trunc i64 %i.03 to i32 91 %mul = shl nsw i64 %i.03, 1 92 %mul1 = mul i64 %n, 5 93 %add = add i64 %mul, %mul1 94 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 95 store i32 %conv, ptr %arrayidx, align 4 96 %mul2 = mul nsw i64 %i.03, 3 97 %mul3 = shl i64 %n, 1 98 %add4 = add i64 %mul2, %mul3 99 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %add4 100 %0 = load i32, ptr %arrayidx5, align 4 101 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 102 store i32 %0, ptr %B.addr.02, align 4 103 %inc = add nsw i64 %i.03, 1 104 %exitcond = icmp ne i64 %inc, %n 105 br i1 %exitcond, label %for.body, label %for.end.loopexit 106 107for.end.loopexit: ; preds = %for.body 108 br label %for.end 109 110for.end: ; preds = %for.end.loopexit, %entry 111 ret void 112} 113 114 115;; for (long int i = 0; i < n; i++) { 116;; A[2*i - n] = i; 117;; *B++ = A[-i + 2*n]; 118 119define void @symbolicsiv2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 120; CHECK-LABEL: 'symbolicsiv2' 121; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 122; CHECK-NEXT: da analyze - none! 123; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 124; CHECK-NEXT: da analyze - none! 125; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 126; CHECK-NEXT: da analyze - confused! 127; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 128; CHECK-NEXT: da analyze - none! 129; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 130; CHECK-NEXT: da analyze - confused! 131; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 132; CHECK-NEXT: da analyze - none! 133; 134entry: 135 %cmp1 = icmp eq i64 %n, 0 136 br i1 %cmp1, label %for.end, label %for.body.preheader 137 138for.body.preheader: ; preds = %entry 139 br label %for.body 140 141for.body: ; preds = %for.body.preheader, %for.body 142 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 143 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 144 %conv = trunc i64 %i.03 to i32 145 %mul = shl nsw i64 %i.03, 1 146 %sub = sub i64 %mul, %n 147 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 148 store i32 %conv, ptr %arrayidx, align 4 149 %mul2 = shl i64 %n, 1 150 %add = sub i64 %mul2, %i.03 151 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add 152 %0 = load i32, ptr %arrayidx3, align 4 153 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 154 store i32 %0, ptr %B.addr.02, align 4 155 %inc = add nsw i64 %i.03, 1 156 %exitcond = icmp ne i64 %inc, %n 157 br i1 %exitcond, label %for.body, label %for.end.loopexit 158 159for.end.loopexit: ; preds = %for.body 160 br label %for.end 161 162for.end: ; preds = %for.end.loopexit, %entry 163 ret void 164} 165 166 167;; for (long int i = 0; i < n; i++) { 168;; A[-2*i + n + 1] = i; 169;; *B++ = A[i - 2*n]; 170 171define void @symbolicsiv3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 172; CHECK-LABEL: 'symbolicsiv3' 173; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 174; CHECK-NEXT: da analyze - none! 175; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 176; CHECK-NEXT: da analyze - none! 177; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 178; CHECK-NEXT: da analyze - confused! 179; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 180; CHECK-NEXT: da analyze - none! 181; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 182; CHECK-NEXT: da analyze - confused! 183; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 184; CHECK-NEXT: da analyze - none! 185; 186entry: 187 %cmp1 = icmp eq i64 %n, 0 188 br i1 %cmp1, label %for.end, label %for.body.preheader 189 190for.body.preheader: ; preds = %entry 191 br label %for.body 192 193for.body: ; preds = %for.body.preheader, %for.body 194 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 195 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 196 %conv = trunc i64 %i.03 to i32 197 %mul = mul nsw i64 %i.03, -2 198 %add = add i64 %mul, %n 199 %add1 = add i64 %add, 1 200 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add1 201 store i32 %conv, ptr %arrayidx, align 4 202 %mul2 = shl i64 %n, 1 203 %sub = sub i64 %i.03, %mul2 204 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %sub 205 %0 = load i32, ptr %arrayidx3, align 4 206 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 207 store i32 %0, ptr %B.addr.02, align 4 208 %inc = add nsw i64 %i.03, 1 209 %exitcond = icmp ne i64 %inc, %n 210 br i1 %exitcond, label %for.body, label %for.end.loopexit 211 212for.end.loopexit: ; preds = %for.body 213 br label %for.end 214 215for.end: ; preds = %for.end.loopexit, %entry 216 ret void 217} 218 219 220;; for (long int i = 0; i < n; i++) { 221;; A[-2*i + 3*n] = i; 222;; *B++ = A[-i + n]; 223 224define void @symbolicsiv4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 225; CHECK-LABEL: 'symbolicsiv4' 226; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 227; CHECK-NEXT: da analyze - none! 228; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 229; CHECK-NEXT: da analyze - none! 230; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 231; CHECK-NEXT: da analyze - confused! 232; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 233; CHECK-NEXT: da analyze - none! 234; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 235; CHECK-NEXT: da analyze - confused! 236; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 237; CHECK-NEXT: da analyze - none! 238; 239entry: 240 %cmp1 = icmp eq i64 %n, 0 241 br i1 %cmp1, label %for.end, label %for.body.preheader 242 243for.body.preheader: ; preds = %entry 244 br label %for.body 245 246for.body: ; preds = %for.body.preheader, %for.body 247 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 248 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 249 %conv = trunc i64 %i.03 to i32 250 %mul = mul nsw i64 %i.03, -2 251 %mul1 = mul i64 %n, 3 252 %add = add i64 %mul, %mul1 253 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 254 store i32 %conv, ptr %arrayidx, align 4 255 %add2 = sub i64 %n, %i.03 256 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add2 257 %0 = load i32, ptr %arrayidx3, align 4 258 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 259 store i32 %0, ptr %B.addr.02, align 4 260 %inc = add nsw i64 %i.03, 1 261 %exitcond = icmp ne i64 %inc, %n 262 br i1 %exitcond, label %for.body, label %for.end.loopexit 263 264for.end.loopexit: ; preds = %for.body 265 br label %for.end 266 267for.end: ; preds = %for.end.loopexit, %entry 268 ret void 269} 270 271 272;; for (long int i = 0; i < n; i++) { 273;; A[-2*i - 2*n] = i; 274;; *B++ = A[-i - n]; 275 276define void @symbolicsiv5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 277; CHECK-LABEL: 'symbolicsiv5' 278; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 279; CHECK-NEXT: da analyze - none! 280; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 281; CHECK-NEXT: da analyze - none! 282; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 283; CHECK-NEXT: da analyze - confused! 284; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4 285; CHECK-NEXT: da analyze - none! 286; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 287; CHECK-NEXT: da analyze - confused! 288; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 289; CHECK-NEXT: da analyze - none! 290; 291entry: 292 %cmp1 = icmp eq i64 %n, 0 293 br i1 %cmp1, label %for.end, label %for.body.preheader 294 295for.body.preheader: ; preds = %entry 296 br label %for.body 297 298for.body: ; preds = %for.body.preheader, %for.body 299 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 300 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 301 %conv = trunc i64 %i.03 to i32 302 %mul = mul nsw i64 %i.03, -2 303 %mul1 = shl i64 %n, 1 304 %sub = sub i64 %mul, %mul1 305 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub 306 store i32 %conv, ptr %arrayidx, align 4 307 %sub2 = sub nsw i64 0, %i.03 308 %sub3 = sub i64 %sub2, %n 309 %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %sub3 310 %0 = load i32, ptr %arrayidx4, align 4 311 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 312 store i32 %0, ptr %B.addr.02, align 4 313 %inc = add nsw i64 %i.03, 1 314 %exitcond = icmp ne i64 %inc, %n 315 br i1 %exitcond, label %for.body, label %for.end.loopexit 316 317for.end.loopexit: ; preds = %for.body 318 br label %for.end 319 320for.end: ; preds = %for.end.loopexit, %entry 321 ret void 322} 323 324 325;; why doesn't SCEV package understand that n >= 0? 326;; for (long unsigned i = 0; i < n; i++) { 327;; A[i + n + 1] = i; 328;; *B++ = A[-i]; 329 330define void @weaktest(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 331; CHECK-LABEL: 'weaktest' 332; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 333; CHECK-NEXT: da analyze - none! 334; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 335; CHECK-NEXT: da analyze - flow [*|<] splitable! 336; CHECK-NEXT: da analyze - split level = 1, iteration = ((0 smax (-4 + (-4 * %n))) /u 8)! 337; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 338; CHECK-NEXT: da analyze - confused! 339; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 340; CHECK-NEXT: da analyze - none! 341; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 342; CHECK-NEXT: da analyze - confused! 343; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 344; CHECK-NEXT: da analyze - none! 345; 346entry: 347 %cmp1 = icmp eq i64 %n, 0 348 br i1 %cmp1, label %for.end, label %for.body.preheader 349 350for.body.preheader: ; preds = %entry 351 br label %for.body 352 353for.body: ; preds = %for.body.preheader, %for.body 354 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 355 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 356 %conv = trunc i64 %i.03 to i32 357 %add = add i64 %i.03, %n 358 %add1 = add i64 %add, 1 359 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add1 360 store i32 %conv, ptr %arrayidx, align 4 361 %sub = sub i64 0, %i.03 362 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub 363 %0 = load i32, ptr %arrayidx2, align 4 364 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 365 store i32 %0, ptr %B.addr.02, align 4 366 %inc = add i64 %i.03, 1 367 %exitcond = icmp ne i64 %inc, %n 368 br i1 %exitcond, label %for.body, label %for.end.loopexit 369 370for.end.loopexit: ; preds = %for.body 371 br label %for.end 372 373for.end: ; preds = %for.end.loopexit, %entry 374 ret void 375} 376 377 378;; for (long int i = 0; i < n; i++) { 379;; A[4*N*i + M] = i; 380;; *B++ = A[4*N*i + 3*M + 1]; 381 382define void @symbolicsiv6(ptr %A, ptr %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp { 383; CHECK-LABEL: 'symbolicsiv6' 384; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 385; CHECK-NEXT: da analyze - none! 386; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4 387; CHECK-NEXT: da analyze - none! 388; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 389; CHECK-NEXT: da analyze - confused! 390; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4 391; CHECK-NEXT: da analyze - none! 392; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 393; CHECK-NEXT: da analyze - confused! 394; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 395; CHECK-NEXT: da analyze - none! 396; 397entry: 398 %cmp1 = icmp eq i64 %n, 0 399 br i1 %cmp1, label %for.end, label %for.body.preheader 400 401for.body.preheader: ; preds = %entry 402 br label %for.body 403 404for.body: ; preds = %for.body.preheader, %for.body 405 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 406 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 407 %conv = trunc i64 %i.03 to i32 408 %mul = shl i64 %N, 2 409 %mul1 = mul i64 %mul, %i.03 410 %add = add i64 %mul1, %M 411 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 412 store i32 %conv, ptr %arrayidx, align 4 413 %mul2 = shl i64 %N, 2 414 %mul3 = mul i64 %mul2, %i.03 415 %mul4 = mul i64 %M, 3 416 %add5 = add i64 %mul3, %mul4 417 %add6 = add i64 %add5, 1 418 %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add6 419 %0 = load i32, ptr %arrayidx7, align 4 420 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 421 store i32 %0, ptr %B.addr.02, align 4 422 %inc = add nsw i64 %i.03, 1 423 %exitcond = icmp ne i64 %inc, %n 424 br i1 %exitcond, label %for.body, label %for.end.loopexit 425 426for.end.loopexit: ; preds = %for.body 427 br label %for.end 428 429for.end: ; preds = %for.end.loopexit, %entry 430 ret void 431} 432 433 434;; for (long int i = 0; i < n; i++) { 435;; A[2*N*i + M] = i; 436;; *B++ = A[2*N*i - 3*M + 2]; 437 438define void @symbolicsiv7(ptr %A, ptr %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp { 439; CHECK-LABEL: 'symbolicsiv7' 440; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 441; CHECK-NEXT: da analyze - none! 442; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx6, align 4 443; CHECK-NEXT: da analyze - flow [<>]! 444; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 445; CHECK-NEXT: da analyze - confused! 446; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx6, align 4 --> Dst: %1 = load i32, ptr %arrayidx6, align 4 447; CHECK-NEXT: da analyze - none! 448; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx6, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 449; CHECK-NEXT: da analyze - confused! 450; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 451; CHECK-NEXT: da analyze - none! 452; 453entry: 454 %cmp1 = icmp eq i64 %n, 0 455 br i1 %cmp1, label %for.end, label %for.body.preheader 456 457for.body.preheader: ; preds = %entry 458 br label %for.body 459 460for.body: ; preds = %for.body.preheader, %for.body 461 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 462 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 463 %conv = trunc i64 %i.03 to i32 464 %mul = shl i64 %N, 1 465 %mul1 = mul i64 %mul, %i.03 466 %add = add i64 %mul1, %M 467 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 468 store i32 %conv, ptr %arrayidx, align 4 469 %mul2 = shl i64 %N, 1 470 %mul3 = mul i64 %mul2, %i.03 471 %0 = mul i64 %M, -3 472 %sub = add i64 %mul3, %0 473 %add5 = add i64 %sub, 2 474 %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %add5 475 %1 = load i32, ptr %arrayidx6, align 4 476 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 477 store i32 %1, ptr %B.addr.02, align 4 478 %inc = add nsw i64 %i.03, 1 479 %exitcond = icmp ne i64 %inc, %n 480 br i1 %exitcond, label %for.body, label %for.end.loopexit 481 482for.end.loopexit: ; preds = %for.body 483 br label %for.end 484 485for.end: ; preds = %for.end.loopexit, %entry 486 ret void 487} 488