612 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \3; RUN: | FileCheck %s4 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 416; CHECK-NEXT: da analyze - none!17; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 418; 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 420; CHECK-NEXT: da analyze - confused!21; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 422; 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 424; 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 426; CHECK-NEXT: da analyze - none!27;28entry:29 br label %for.body30 31for.body: ; preds = %entry, %for.body32 %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 i3235 %add = add i64 %i.02, 1036 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add37 store i32 %conv, ptr %arrayidx, align 438 %mul = shl i64 %i.02, 139 %add13 = or disjoint i64 %mul, 140 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %add1341 %0 = load i32, ptr %arrayidx2, align 442 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 143 store i32 %0, ptr %B.addr.01, align 444 %inc = add i64 %i.02, 145 %exitcond = icmp ne i64 %inc, 1046 br i1 %exitcond, label %for.body, label %for.end47 48for.end: ; preds = %for.body49 ret void50}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 460; CHECK-NEXT: da analyze - none!61; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 462; 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 464; CHECK-NEXT: da analyze - confused!65; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 466; 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 468; 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 470; CHECK-NEXT: da analyze - none!71;72entry:73 br label %for.body74 75for.body: ; preds = %entry, %for.body76 %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 i3279 %mul = shl i64 %i.02, 280 %add = add i64 %mul, 1081 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add82 store i32 %conv, ptr %arrayidx, align 483 %mul1 = shl i64 %i.02, 184 %add23 = or disjoint i64 %mul1, 185 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add2386 %0 = load i32, ptr %arrayidx3, align 487 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 188 store i32 %0, ptr %B.addr.01, align 489 %inc = add i64 %i.02, 190 %exitcond = icmp ne i64 %inc, 1091 br i1 %exitcond, label %for.body, label %for.end92 93for.end: ; preds = %for.body94 ret void95}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 4105; CHECK-NEXT: da analyze - none!106; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4107; 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 4109; CHECK-NEXT: da analyze - confused!110; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4111; 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 4113; 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 4115; CHECK-NEXT: da analyze - none!116;117entry:118 br label %for.body119 120for.body: ; preds = %entry, %for.body121 %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 i32124 %mul = mul i64 %i.02, 6125 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul126 store i32 %conv, ptr %arrayidx, align 4127 %add = add i64 %i.02, 60128 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add129 %0 = load i32, ptr %arrayidx1, align 4130 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1131 store i32 %0, ptr %B.addr.01, align 4132 %inc = add i64 %i.02, 1133 %exitcond = icmp ne i64 %inc, 10134 br i1 %exitcond, label %for.body, label %for.end135 136for.end: ; preds = %for.body137 ret void138}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 4148; CHECK-NEXT: da analyze - none!149; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4150; 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 4152; CHECK-NEXT: da analyze - confused!153; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4154; 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 4156; 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 4158; CHECK-NEXT: da analyze - none!159;160entry:161 br label %for.body162 163for.body: ; preds = %entry, %for.body164 %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 i32167 %mul = mul i64 %i.02, 6168 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul169 store i32 %conv, ptr %arrayidx, align 4170 %add = add i64 %i.02, 60171 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add172 %0 = load i32, ptr %arrayidx1, align 4173 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1174 store i32 %0, ptr %B.addr.01, align 4175 %inc = add i64 %i.02, 1176 %exitcond = icmp ne i64 %inc, 11177 br i1 %exitcond, label %for.body, label %for.end178 179for.end: ; preds = %for.body180 ret void181}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 4191; CHECK-NEXT: da analyze - none!192; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4193; 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 4195; CHECK-NEXT: da analyze - confused!196; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4197; 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 4199; 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 4201; CHECK-NEXT: da analyze - none!202;203entry:204 br label %for.body205 206for.body: ; preds = %entry, %for.body207 %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 i32210 %mul = mul i64 %i.02, 6211 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul212 store i32 %conv, ptr %arrayidx, align 4213 %add = add i64 %i.02, 60214 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add215 %0 = load i32, ptr %arrayidx1, align 4216 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1217 store i32 %0, ptr %B.addr.01, align 4218 %inc = add i64 %i.02, 1219 %exitcond = icmp ne i64 %inc, 12220 br i1 %exitcond, label %for.body, label %for.end221 222for.end: ; preds = %for.body223 ret void224}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 4234; CHECK-NEXT: da analyze - none!235; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4236; 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 4238; CHECK-NEXT: da analyze - confused!239; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4240; 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 4242; 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 4244; CHECK-NEXT: da analyze - none!245;246entry:247 br label %for.body248 249for.body: ; preds = %entry, %for.body250 %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 i32253 %mul = mul i64 %i.02, 6254 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul255 store i32 %conv, ptr %arrayidx, align 4256 %add = add i64 %i.02, 60257 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add258 %0 = load i32, ptr %arrayidx1, align 4259 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1260 store i32 %0, ptr %B.addr.01, align 4261 %inc = add i64 %i.02, 1262 %exitcond = icmp ne i64 %inc, 13263 br i1 %exitcond, label %for.body, label %for.end264 265for.end: ; preds = %for.body266 ret void267}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 4277; CHECK-NEXT: da analyze - none!278; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4279; 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 4281; CHECK-NEXT: da analyze - confused!282; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4283; 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 4285; 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 4287; CHECK-NEXT: da analyze - none!288;289entry:290 br label %for.body291 292for.body: ; preds = %entry, %for.body293 %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 i32296 %mul = mul i64 %i.02, 6297 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul298 store i32 %conv, ptr %arrayidx, align 4299 %add = add i64 %i.02, 60300 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add301 %0 = load i32, ptr %arrayidx1, align 4302 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1303 store i32 %0, ptr %B.addr.01, align 4304 %inc = add i64 %i.02, 1305 %exitcond = icmp ne i64 %inc, 18306 br i1 %exitcond, label %for.body, label %for.end307 308for.end: ; preds = %for.body309 ret void310}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 4320; CHECK-NEXT: da analyze - none!321; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4322; 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 4324; CHECK-NEXT: da analyze - confused!325; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4326; 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 4328; 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 4330; CHECK-NEXT: da analyze - none!331;332entry:333 br label %for.body334 335for.body: ; preds = %entry, %for.body336 %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 i32339 %mul = mul i64 %i.02, 6340 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul341 store i32 %conv, ptr %arrayidx, align 4342 %add = add i64 %i.02, 60343 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add344 %0 = load i32, ptr %arrayidx1, align 4345 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1346 store i32 %0, ptr %B.addr.01, align 4347 %inc = add i64 %i.02, 1348 %exitcond = icmp ne i64 %inc, 19349 br i1 %exitcond, label %for.body, label %for.end350 351for.end: ; preds = %for.body352 ret void353}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 4363; CHECK-NEXT: da analyze - none!364; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4365; 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 4367; CHECK-NEXT: da analyze - confused!368; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4369; 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 4371; 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 4373; CHECK-NEXT: da analyze - none!374;375entry:376 br label %for.body377 378for.body: ; preds = %entry, %for.body379 %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 i32382 %mul = mul i64 %i.02, -6383 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul384 store i32 %conv, ptr %arrayidx, align 4385 %sub1 = sub i64 -60, %i.02386 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1387 %0 = load i32, ptr %arrayidx2, align 4388 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1389 store i32 %0, ptr %B.addr.01, align 4390 %inc = add i64 %i.02, 1391 %exitcond = icmp ne i64 %inc, 10392 br i1 %exitcond, label %for.body, label %for.end393 394for.end: ; preds = %for.body395 ret void396}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 4406; CHECK-NEXT: da analyze - none!407; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4408; 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 4410; CHECK-NEXT: da analyze - confused!411; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4412; 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 4414; 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 4416; CHECK-NEXT: da analyze - none!417;418entry:419 br label %for.body420 421for.body: ; preds = %entry, %for.body422 %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 i32425 %mul = mul i64 %i.02, -6426 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul427 store i32 %conv, ptr %arrayidx, align 4428 %sub1 = sub i64 -60, %i.02429 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1430 %0 = load i32, ptr %arrayidx2, align 4431 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1432 store i32 %0, ptr %B.addr.01, align 4433 %inc = add i64 %i.02, 1434 %exitcond = icmp ne i64 %inc, 11435 br i1 %exitcond, label %for.body, label %for.end436 437for.end: ; preds = %for.body438 ret void439}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 4449; CHECK-NEXT: da analyze - none!450; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4451; 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 4453; CHECK-NEXT: da analyze - confused!454; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4455; 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 4457; 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 4459; CHECK-NEXT: da analyze - none!460;461entry:462 br label %for.body463 464for.body: ; preds = %entry, %for.body465 %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 i32468 %mul = mul i64 %i.02, -6469 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul470 store i32 %conv, ptr %arrayidx, align 4471 %sub1 = sub i64 -60, %i.02472 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1473 %0 = load i32, ptr %arrayidx2, align 4474 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1475 store i32 %0, ptr %B.addr.01, align 4476 %inc = add i64 %i.02, 1477 %exitcond = icmp ne i64 %inc, 12478 br i1 %exitcond, label %for.body, label %for.end479 480for.end: ; preds = %for.body481 ret void482}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 4492; CHECK-NEXT: da analyze - none!493; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4494; 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 4496; CHECK-NEXT: da analyze - confused!497; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4498; 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 4500; 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 4502; CHECK-NEXT: da analyze - none!503;504entry:505 br label %for.body506 507for.body: ; preds = %entry, %for.body508 %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 i32511 %mul = mul i64 %i.02, -6512 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul513 store i32 %conv, ptr %arrayidx, align 4514 %sub1 = sub i64 -60, %i.02515 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1516 %0 = load i32, ptr %arrayidx2, align 4517 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1518 store i32 %0, ptr %B.addr.01, align 4519 %inc = add i64 %i.02, 1520 %exitcond = icmp ne i64 %inc, 13521 br i1 %exitcond, label %for.body, label %for.end522 523for.end: ; preds = %for.body524 ret void525}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 4535; CHECK-NEXT: da analyze - none!536; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4537; 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 4539; CHECK-NEXT: da analyze - confused!540; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4541; 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 4543; 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 4545; CHECK-NEXT: da analyze - none!546;547entry:548 br label %for.body549 550for.body: ; preds = %entry, %for.body551 %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 i32554 %mul = mul i64 %i.02, -6555 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul556 store i32 %conv, ptr %arrayidx, align 4557 %sub1 = sub i64 -60, %i.02558 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1559 %0 = load i32, ptr %arrayidx2, align 4560 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1561 store i32 %0, ptr %B.addr.01, align 4562 %inc = add i64 %i.02, 1563 %exitcond = icmp ne i64 %inc, 18564 br i1 %exitcond, label %for.body, label %for.end565 566for.end: ; preds = %for.body567 ret void568}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 4578; CHECK-NEXT: da analyze - none!579; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4580; 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 4582; CHECK-NEXT: da analyze - confused!583; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4584; 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 4586; 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 4588; CHECK-NEXT: da analyze - none!589;590entry:591 br label %for.body592 593for.body: ; preds = %entry, %for.body594 %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 i32597 %mul = mul i64 %i.02, -6598 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul599 store i32 %conv, ptr %arrayidx, align 4600 %sub1 = sub i64 -60, %i.02601 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub1602 %0 = load i32, ptr %arrayidx2, align 4603 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1604 store i32 %0, ptr %B.addr.01, align 4605 %inc = add i64 %i.02, 1606 %exitcond = icmp ne i64 %inc, 19607 br i1 %exitcond, label %for.body, label %for.end608 609for.end: ; preds = %for.body610 ret void611}612