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 unsigned i = 0; i < 10; i++) { 10;; A[i + 10] = i; 11;; *B++ = A[2*i + 1]; 12 13define void @exact0(ptr %A, ptr %B) nounwind uwtable ssp { 14; CHECK-LABEL: 'exact0' 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 %arrayidx2, align 4 18; CHECK-NEXT: da analyze - flow [<=|<]! 19; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 20; CHECK-NEXT: da analyze - confused! 21; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 22; CHECK-NEXT: da analyze - none! 23; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 24; CHECK-NEXT: da analyze - confused! 25; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 26; CHECK-NEXT: da analyze - none! 27; 28entry: 29 br label %for.body 30 31for.body: ; preds = %entry, %for.body 32 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 33 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 34 %conv = trunc i64 %i.02 to i32 35 %add = add i64 %i.02, 10 36 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 37 store i32 %conv, ptr %arrayidx, align 4 38 %mul = shl i64 %i.02, 1 39 %add13 = or disjoint i64 %mul, 1 40 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %add13 41 %0 = load i32, ptr %arrayidx2, align 4 42 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 43 store i32 %0, ptr %B.addr.01, align 4 44 %inc = add i64 %i.02, 1 45 %exitcond = icmp ne i64 %inc, 10 46 br i1 %exitcond, label %for.body, label %for.end 47 48for.end: ; preds = %for.body 49 ret void 50} 51 52 53;; for (long unsigned i = 0; i < 10; i++) { 54;; A[4*i + 10] = i; 55;; *B++ = A[2*i + 1]; 56 57define void @exact1(ptr %A, ptr %B) nounwind uwtable ssp { 58; CHECK-LABEL: 'exact1' 59; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 60; CHECK-NEXT: da analyze - none! 61; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 62; CHECK-NEXT: da analyze - none! 63; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 64; CHECK-NEXT: da analyze - confused! 65; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4 66; CHECK-NEXT: da analyze - none! 67; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 68; CHECK-NEXT: da analyze - confused! 69; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 70; CHECK-NEXT: da analyze - none! 71; 72entry: 73 br label %for.body 74 75for.body: ; preds = %entry, %for.body 76 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 77 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 78 %conv = trunc i64 %i.02 to i32 79 %mul = shl i64 %i.02, 2 80 %add = add i64 %mul, 10 81 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 82 store i32 %conv, ptr %arrayidx, align 4 83 %mul1 = shl i64 %i.02, 1 84 %add23 = or disjoint i64 %mul1, 1 85 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add23 86 %0 = load i32, ptr %arrayidx3, align 4 87 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 88 store i32 %0, ptr %B.addr.01, align 4 89 %inc = add i64 %i.02, 1 90 %exitcond = icmp ne i64 %inc, 10 91 br i1 %exitcond, label %for.body, label %for.end 92 93for.end: ; preds = %for.body 94 ret void 95} 96 97 98;; for (long unsigned i = 0; i < 10; i++) { 99;; A[6*i] = i; 100;; *B++ = A[i + 60]; 101 102define void @exact2(ptr %A, ptr %B) nounwind uwtable ssp { 103; CHECK-LABEL: 'exact2' 104; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 105; CHECK-NEXT: da analyze - none! 106; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 107; CHECK-NEXT: da analyze - none! 108; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 109; CHECK-NEXT: da analyze - confused! 110; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 111; CHECK-NEXT: da analyze - none! 112; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 113; CHECK-NEXT: da analyze - confused! 114; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 115; CHECK-NEXT: da analyze - none! 116; 117entry: 118 br label %for.body 119 120for.body: ; preds = %entry, %for.body 121 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 122 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 123 %conv = trunc i64 %i.02 to i32 124 %mul = mul i64 %i.02, 6 125 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 126 store i32 %conv, ptr %arrayidx, align 4 127 %add = add i64 %i.02, 60 128 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 129 %0 = load i32, ptr %arrayidx1, align 4 130 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 131 store i32 %0, ptr %B.addr.01, align 4 132 %inc = add i64 %i.02, 1 133 %exitcond = icmp ne i64 %inc, 10 134 br i1 %exitcond, label %for.body, label %for.end 135 136for.end: ; preds = %for.body 137 ret void 138} 139 140 141;; for (long unsigned i = 0; i <= 10; i++) { 142;; A[6*i] = i; 143;; *B++ = A[i + 60]; 144 145define void @exact3(ptr %A, ptr %B) nounwind uwtable ssp { 146; CHECK-LABEL: 'exact3' 147; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 148; CHECK-NEXT: da analyze - none! 149; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 150; CHECK-NEXT: da analyze - flow [>]! 151; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 152; CHECK-NEXT: da analyze - confused! 153; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 154; CHECK-NEXT: da analyze - none! 155; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 156; CHECK-NEXT: da analyze - confused! 157; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 158; CHECK-NEXT: da analyze - none! 159; 160entry: 161 br label %for.body 162 163for.body: ; preds = %entry, %for.body 164 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 165 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 166 %conv = trunc i64 %i.02 to i32 167 %mul = mul i64 %i.02, 6 168 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 169 store i32 %conv, ptr %arrayidx, align 4 170 %add = add i64 %i.02, 60 171 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 172 %0 = load i32, ptr %arrayidx1, align 4 173 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 174 store i32 %0, ptr %B.addr.01, align 4 175 %inc = add i64 %i.02, 1 176 %exitcond = icmp ne i64 %inc, 11 177 br i1 %exitcond, label %for.body, label %for.end 178 179for.end: ; preds = %for.body 180 ret void 181} 182 183 184;; for (long unsigned i = 0; i < 12; i++) { 185;; A[6*i] = i; 186;; *B++ = A[i + 60]; 187 188define void @exact4(ptr %A, ptr %B) nounwind uwtable ssp { 189; CHECK-LABEL: 'exact4' 190; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 191; CHECK-NEXT: da analyze - none! 192; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 193; CHECK-NEXT: da analyze - flow [>]! 194; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 195; CHECK-NEXT: da analyze - confused! 196; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 197; CHECK-NEXT: da analyze - none! 198; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 199; CHECK-NEXT: da analyze - confused! 200; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 201; CHECK-NEXT: da analyze - none! 202; 203entry: 204 br label %for.body 205 206for.body: ; preds = %entry, %for.body 207 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 208 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 209 %conv = trunc i64 %i.02 to i32 210 %mul = mul i64 %i.02, 6 211 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 212 store i32 %conv, ptr %arrayidx, align 4 213 %add = add i64 %i.02, 60 214 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 215 %0 = load i32, ptr %arrayidx1, align 4 216 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 217 store i32 %0, ptr %B.addr.01, align 4 218 %inc = add i64 %i.02, 1 219 %exitcond = icmp ne i64 %inc, 12 220 br i1 %exitcond, label %for.body, label %for.end 221 222for.end: ; preds = %for.body 223 ret void 224} 225 226 227;; for (long unsigned i = 0; i <= 12; i++) { 228;; A[6*i] = i; 229;; *B++ = A[i + 60]; 230 231define void @exact5(ptr %A, ptr %B) nounwind uwtable ssp { 232; CHECK-LABEL: 'exact5' 233; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 234; CHECK-NEXT: da analyze - none! 235; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 236; CHECK-NEXT: da analyze - flow [=>|<]! 237; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 238; CHECK-NEXT: da analyze - confused! 239; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 240; CHECK-NEXT: da analyze - none! 241; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 242; CHECK-NEXT: da analyze - confused! 243; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 244; CHECK-NEXT: da analyze - none! 245; 246entry: 247 br label %for.body 248 249for.body: ; preds = %entry, %for.body 250 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 251 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 252 %conv = trunc i64 %i.02 to i32 253 %mul = mul i64 %i.02, 6 254 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 255 store i32 %conv, ptr %arrayidx, align 4 256 %add = add i64 %i.02, 60 257 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 258 %0 = load i32, ptr %arrayidx1, align 4 259 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 260 store i32 %0, ptr %B.addr.01, align 4 261 %inc = add i64 %i.02, 1 262 %exitcond = icmp ne i64 %inc, 13 263 br i1 %exitcond, label %for.body, label %for.end 264 265for.end: ; preds = %for.body 266 ret void 267} 268 269 270;; for (long unsigned i = 0; i < 18; i++) { 271;; A[6*i] = i; 272;; *B++ = A[i + 60]; 273 274define void @exact6(ptr %A, ptr %B) nounwind uwtable ssp { 275; CHECK-LABEL: 'exact6' 276; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 277; CHECK-NEXT: da analyze - none! 278; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 279; CHECK-NEXT: da analyze - flow [=>|<]! 280; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 281; CHECK-NEXT: da analyze - confused! 282; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 283; CHECK-NEXT: da analyze - none! 284; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 285; CHECK-NEXT: da analyze - confused! 286; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 287; CHECK-NEXT: da analyze - none! 288; 289entry: 290 br label %for.body 291 292for.body: ; preds = %entry, %for.body 293 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 294 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 295 %conv = trunc i64 %i.02 to i32 296 %mul = mul i64 %i.02, 6 297 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 298 store i32 %conv, ptr %arrayidx, align 4 299 %add = add i64 %i.02, 60 300 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 301 %0 = load i32, ptr %arrayidx1, align 4 302 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 303 store i32 %0, ptr %B.addr.01, align 4 304 %inc = add i64 %i.02, 1 305 %exitcond = icmp ne i64 %inc, 18 306 br i1 %exitcond, label %for.body, label %for.end 307 308for.end: ; preds = %for.body 309 ret void 310} 311 312 313;; for (long unsigned i = 0; i <= 18; i++) { 314;; A[6*i] = i; 315;; *B++ = A[i + 60]; 316 317define void @exact7(ptr %A, ptr %B) nounwind uwtable ssp { 318; CHECK-LABEL: 'exact7' 319; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 320; CHECK-NEXT: da analyze - none! 321; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 322; CHECK-NEXT: da analyze - flow [*|<]! 323; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 324; CHECK-NEXT: da analyze - confused! 325; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 326; CHECK-NEXT: da analyze - none! 327; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 328; CHECK-NEXT: da analyze - confused! 329; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 330; CHECK-NEXT: da analyze - none! 331; 332entry: 333 br label %for.body 334 335for.body: ; preds = %entry, %for.body 336 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 337 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 338 %conv = trunc i64 %i.02 to i32 339 %mul = mul i64 %i.02, 6 340 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 341 store i32 %conv, ptr %arrayidx, align 4 342 %add = add i64 %i.02, 60 343 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add 344 %0 = load i32, ptr %arrayidx1, align 4 345 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 346 store i32 %0, ptr %B.addr.01, align 4 347 %inc = add i64 %i.02, 1 348 %exitcond = icmp ne i64 %inc, 19 349 br i1 %exitcond, label %for.body, label %for.end 350 351for.end: ; preds = %for.body 352 ret void 353} 354 355 356;; for (long unsigned i = 0; i < 10; i++) { 357;; A[-6*i] = i; 358;; *B++ = A[-i - 60]; 359 360define void @exact8(ptr %A, ptr %B) nounwind uwtable ssp { 361; CHECK-LABEL: 'exact8' 362; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 363; CHECK-NEXT: da analyze - none! 364; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 365; CHECK-NEXT: da analyze - none! 366; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 367; CHECK-NEXT: da analyze - confused! 368; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 369; CHECK-NEXT: da analyze - none! 370; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 371; CHECK-NEXT: da analyze - confused! 372; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 373; CHECK-NEXT: da analyze - none! 374; 375entry: 376 br label %for.body 377 378for.body: ; preds = %entry, %for.body 379 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 380 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 381 %conv = trunc i64 %i.02 to i32 382 %mul = mul i64 %i.02, -6 383 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 384 store i32 %conv, ptr %arrayidx, align 4 385 %sub1 = sub i64 -60, %i.02 386 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 387 %0 = load i32, ptr %arrayidx2, align 4 388 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 389 store i32 %0, ptr %B.addr.01, align 4 390 %inc = add i64 %i.02, 1 391 %exitcond = icmp ne i64 %inc, 10 392 br i1 %exitcond, label %for.body, label %for.end 393 394for.end: ; preds = %for.body 395 ret void 396} 397 398 399;; for (long unsigned i = 0; i <= 10; i++) { 400;; A[-6*i] = i; 401;; *B++ = A[-i - 60]; 402 403define void @exact9(ptr %A, ptr %B) nounwind uwtable ssp { 404; CHECK-LABEL: 'exact9' 405; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 406; CHECK-NEXT: da analyze - none! 407; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 408; CHECK-NEXT: da analyze - flow [>]! 409; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 410; CHECK-NEXT: da analyze - confused! 411; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 412; CHECK-NEXT: da analyze - none! 413; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 414; CHECK-NEXT: da analyze - confused! 415; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 416; CHECK-NEXT: da analyze - none! 417; 418entry: 419 br label %for.body 420 421for.body: ; preds = %entry, %for.body 422 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 423 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 424 %conv = trunc i64 %i.02 to i32 425 %mul = mul i64 %i.02, -6 426 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 427 store i32 %conv, ptr %arrayidx, align 4 428 %sub1 = sub i64 -60, %i.02 429 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 430 %0 = load i32, ptr %arrayidx2, align 4 431 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 432 store i32 %0, ptr %B.addr.01, align 4 433 %inc = add i64 %i.02, 1 434 %exitcond = icmp ne i64 %inc, 11 435 br i1 %exitcond, label %for.body, label %for.end 436 437for.end: ; preds = %for.body 438 ret void 439} 440 441 442;; for (long unsigned i = 0; i < 12; i++) { 443;; A[-6*i] = i; 444;; *B++ = A[-i - 60]; 445 446define void @exact10(ptr %A, ptr %B) nounwind uwtable ssp { 447; CHECK-LABEL: 'exact10' 448; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 449; CHECK-NEXT: da analyze - none! 450; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 451; CHECK-NEXT: da analyze - flow [>]! 452; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 453; CHECK-NEXT: da analyze - confused! 454; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 455; CHECK-NEXT: da analyze - none! 456; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 457; CHECK-NEXT: da analyze - confused! 458; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 459; CHECK-NEXT: da analyze - none! 460; 461entry: 462 br label %for.body 463 464for.body: ; preds = %entry, %for.body 465 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 466 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 467 %conv = trunc i64 %i.02 to i32 468 %mul = mul i64 %i.02, -6 469 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 470 store i32 %conv, ptr %arrayidx, align 4 471 %sub1 = sub i64 -60, %i.02 472 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 473 %0 = load i32, ptr %arrayidx2, align 4 474 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 475 store i32 %0, ptr %B.addr.01, align 4 476 %inc = add i64 %i.02, 1 477 %exitcond = icmp ne i64 %inc, 12 478 br i1 %exitcond, label %for.body, label %for.end 479 480for.end: ; preds = %for.body 481 ret void 482} 483 484 485;; for (long unsigned i = 0; i <= 12; i++) { 486;; A[-6*i] = i; 487;; *B++ = A[-i - 60]; 488 489define void @exact11(ptr %A, ptr %B) nounwind uwtable ssp { 490; CHECK-LABEL: 'exact11' 491; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 492; CHECK-NEXT: da analyze - none! 493; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 494; CHECK-NEXT: da analyze - flow [=>|<]! 495; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 496; CHECK-NEXT: da analyze - confused! 497; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 498; CHECK-NEXT: da analyze - none! 499; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 500; CHECK-NEXT: da analyze - confused! 501; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 502; CHECK-NEXT: da analyze - none! 503; 504entry: 505 br label %for.body 506 507for.body: ; preds = %entry, %for.body 508 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 509 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 510 %conv = trunc i64 %i.02 to i32 511 %mul = mul i64 %i.02, -6 512 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 513 store i32 %conv, ptr %arrayidx, align 4 514 %sub1 = sub i64 -60, %i.02 515 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 516 %0 = load i32, ptr %arrayidx2, align 4 517 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 518 store i32 %0, ptr %B.addr.01, align 4 519 %inc = add i64 %i.02, 1 520 %exitcond = icmp ne i64 %inc, 13 521 br i1 %exitcond, label %for.body, label %for.end 522 523for.end: ; preds = %for.body 524 ret void 525} 526 527 528;; for (long unsigned i = 0; i < 18; i++) { 529;; A[-6*i] = i; 530;; *B++ = A[-i - 60]; 531 532define void @exact12(ptr %A, ptr %B) nounwind uwtable ssp { 533; CHECK-LABEL: 'exact12' 534; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 535; CHECK-NEXT: da analyze - none! 536; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 537; CHECK-NEXT: da analyze - flow [=>|<]! 538; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 539; CHECK-NEXT: da analyze - confused! 540; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 541; CHECK-NEXT: da analyze - none! 542; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 543; CHECK-NEXT: da analyze - confused! 544; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 545; CHECK-NEXT: da analyze - none! 546; 547entry: 548 br label %for.body 549 550for.body: ; preds = %entry, %for.body 551 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 552 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 553 %conv = trunc i64 %i.02 to i32 554 %mul = mul i64 %i.02, -6 555 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 556 store i32 %conv, ptr %arrayidx, align 4 557 %sub1 = sub i64 -60, %i.02 558 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 559 %0 = load i32, ptr %arrayidx2, align 4 560 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 561 store i32 %0, ptr %B.addr.01, align 4 562 %inc = add i64 %i.02, 1 563 %exitcond = icmp ne i64 %inc, 18 564 br i1 %exitcond, label %for.body, label %for.end 565 566for.end: ; preds = %for.body 567 ret void 568} 569 570 571;; for (long unsigned i = 0; i <= 18; i++) { 572;; A[-6*i] = i; 573;; *B++ = A[-i - 60]; 574 575define void @exact13(ptr %A, ptr %B) nounwind uwtable ssp { 576; CHECK-LABEL: 'exact13' 577; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 578; CHECK-NEXT: da analyze - none! 579; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 580; CHECK-NEXT: da analyze - flow [*|<]! 581; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 582; CHECK-NEXT: da analyze - confused! 583; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 584; CHECK-NEXT: da analyze - none! 585; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 586; CHECK-NEXT: da analyze - confused! 587; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 588; CHECK-NEXT: da analyze - none! 589; 590entry: 591 br label %for.body 592 593for.body: ; preds = %entry, %for.body 594 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 595 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 596 %conv = trunc i64 %i.02 to i32 597 %mul = mul i64 %i.02, -6 598 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 599 store i32 %conv, ptr %arrayidx, align 4 600 %sub1 = sub i64 -60, %i.02 601 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1 602 %0 = load i32, ptr %arrayidx2, align 4 603 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 604 store i32 %0, ptr %B.addr.01, align 4 605 %inc = add i64 %i.02, 1 606 %exitcond = icmp ne i64 %inc, 19 607 br i1 %exitcond, label %for.body, label %for.end 608 609for.end: ; preds = %for.body 610 ret void 611} 612