567 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 %s --check-prefixes=CHECK,CHECK-ALL4; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa -da-enable-dependence-test=strong-siv 2>&1 \5; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-STRONG-SIV6 7target 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"8target triple = "x86_64-apple-macosx10.6.0"9 10 11;; for (int i = 0; i < n; i++) {12;; A[i + 2] = i;13;; *B++ = A[i];14 15define void @strong0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {16; CHECK-LABEL: 'strong0'17; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 418; CHECK-NEXT: da analyze - none!19; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 420; CHECK-NEXT: da analyze - consistent flow [2]!21; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 422; CHECK-NEXT: da analyze - confused!23; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 424; CHECK-NEXT: da analyze - none!25; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 426; CHECK-NEXT: da analyze - confused!27; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 428; CHECK-NEXT: da analyze - none!29;30entry:31 %cmp1 = icmp sgt i64 %n, 032 br i1 %cmp1, label %for.body.preheader, label %for.end33 34for.body.preheader: ; preds = %entry35 br label %for.body36 37for.body: ; preds = %for.body.preheader, %for.body38 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]39 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]40 %0 = add nsw i64 %indvars.iv, 241 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %042 %1 = trunc i64 %indvars.iv to i3243 store i32 %1, ptr %arrayidx, align 444 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv45 %2 = load i32, ptr %arrayidx3, align 446 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 147 store i32 %2, ptr %B.addr.02, align 448 %indvars.iv.next = add i64 %indvars.iv, 149 %exitcond = icmp ne i64 %indvars.iv.next, %n50 br i1 %exitcond, label %for.body, label %for.end.loopexit51 52for.end.loopexit: ; preds = %for.body53 br label %for.end54 55for.end: ; preds = %for.end.loopexit, %entry56 ret void57}58 59 60;; for (long int i = 0; i < n; i++) {61;; A[i + 2] = i;62;; *B++ = A[i];63 64define void @strong1(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {65; CHECK-LABEL: 'strong1'66; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %conv2, ptr %arrayidx, align 467; CHECK-NEXT: da analyze - none!68; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 469; CHECK-NEXT: da analyze - consistent flow [2]!70; CHECK-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 471; CHECK-NEXT: da analyze - confused!72; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 473; CHECK-NEXT: da analyze - none!74; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 475; CHECK-NEXT: da analyze - confused!76; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 477; CHECK-NEXT: da analyze - none!78;79entry:80 %cmp1 = icmp sgt i32 %n, 081 br i1 %cmp1, label %for.body.preheader, label %for.end82 83for.body.preheader: ; preds = %entry84 %0 = sext i32 %n to i6485 br label %for.body86 87for.body: ; preds = %for.body.preheader, %for.body88 %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 %conv2 = trunc i64 %i.03 to i3291 %add = add nsw i64 %i.03, 292 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add93 store i32 %conv2, ptr %arrayidx, align 494 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %i.0395 %1 = load i32, ptr %arrayidx3, align 496 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 197 store i32 %1, ptr %B.addr.02, align 498 %inc = add nsw i64 %i.03, 199 %exitcond = icmp ne i64 %inc, %0100 br i1 %exitcond, label %for.body, label %for.end.loopexit101 102for.end.loopexit: ; preds = %for.body103 br label %for.end104 105for.end: ; preds = %for.end.loopexit, %entry106 ret void107}108 109 110;; for (long unsigned i = 0; i < n; i++) {111;; A[i + 2] = i;112;; *B++ = A[i];113 114define void @strong2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {115; CHECK-LABEL: 'strong2'116; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4117; CHECK-NEXT: da analyze - none!118; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4119; CHECK-NEXT: da analyze - consistent flow [2]!120; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4121; CHECK-NEXT: da analyze - confused!122; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4123; CHECK-NEXT: da analyze - none!124; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4125; CHECK-NEXT: da analyze - confused!126; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4127; CHECK-NEXT: da analyze - none!128;129entry:130 %cmp1 = icmp eq i64 %n, 0131 br i1 %cmp1, label %for.end, label %for.body.preheader132 133for.body.preheader: ; preds = %entry134 br label %for.body135 136for.body: ; preds = %for.body.preheader, %for.body137 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]138 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]139 %conv = trunc i64 %i.03 to i32140 %add = add i64 %i.03, 2141 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add142 store i32 %conv, ptr %arrayidx, align 4143 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.03144 %0 = load i32, ptr %arrayidx1, align 4145 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1146 store i32 %0, ptr %B.addr.02, align 4147 %inc = add i64 %i.03, 1148 %exitcond = icmp ne i64 %inc, %n149 br i1 %exitcond, label %for.body, label %for.end.loopexit150 151for.end.loopexit: ; preds = %for.body152 br label %for.end153 154for.end: ; preds = %for.end.loopexit, %entry155 ret void156}157 158 159;; for (int i = 0; i < n; i++) {160;; A[i + 2] = i;161;; *B++ = A[i];162 163define void @strong3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {164; CHECK-LABEL: 'strong3'165; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 4166; CHECK-NEXT: da analyze - none!167; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4168; CHECK-NEXT: da analyze - consistent flow [2]!169; CHECK-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4170; CHECK-NEXT: da analyze - confused!171; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4172; CHECK-NEXT: da analyze - none!173; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4174; CHECK-NEXT: da analyze - confused!175; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4176; CHECK-NEXT: da analyze - none!177;178entry:179 %cmp1 = icmp sgt i32 %n, 0180 br i1 %cmp1, label %for.body.preheader, label %for.end181 182for.body.preheader: ; preds = %entry183 br label %for.body184 185for.body: ; preds = %for.body.preheader, %for.body186 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]187 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]188 %0 = add nsw i64 %indvars.iv, 2189 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %0190 %1 = trunc i64 %indvars.iv to i32191 store i32 %1, ptr %arrayidx, align 4192 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv193 %2 = load i32, ptr %arrayidx2, align 4194 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1195 store i32 %2, ptr %B.addr.02, align 4196 %indvars.iv.next = add i64 %indvars.iv, 1197 %lftr.wideiv = trunc i64 %indvars.iv.next to i32198 %exitcond = icmp ne i32 %lftr.wideiv, %n199 br i1 %exitcond, label %for.body, label %for.end.loopexit200 201for.end.loopexit: ; preds = %for.body202 br label %for.end203 204for.end: ; preds = %for.end.loopexit, %entry205 ret void206}207 208 209;; for (long unsigned i = 0; i < 19; i++) {210;; A[i + 19] = i;211;; *B++ = A[i];212 213define void @strong4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {214; CHECK-LABEL: 'strong4'215; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4216; CHECK-NEXT: da analyze - none!217; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4218; CHECK-NEXT: da analyze - none!219; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4220; CHECK-NEXT: da analyze - confused!221; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4222; CHECK-NEXT: da analyze - none!223; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4224; CHECK-NEXT: da analyze - confused!225; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4226; CHECK-NEXT: da analyze - none!227;228entry:229 br label %for.body230 231for.body: ; preds = %entry, %for.body232 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]233 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]234 %conv = trunc i64 %i.02 to i32235 %add = add i64 %i.02, 19236 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add237 store i32 %conv, ptr %arrayidx, align 4238 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02239 %0 = load i32, ptr %arrayidx1, align 4240 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1241 store i32 %0, ptr %B.addr.01, align 4242 %inc = add i64 %i.02, 1243 %exitcond = icmp ne i64 %inc, 19244 br i1 %exitcond, label %for.body, label %for.end245 246for.end: ; preds = %for.body247 ret void248}249 250 251;; for (long unsigned i = 0; i < 20; i++) {252;; A[i + 19] = i;253;; *B++ = A[i];254 255define void @strong5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {256; CHECK-LABEL: 'strong5'257; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4258; CHECK-NEXT: da analyze - none!259; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4260; CHECK-NEXT: da analyze - consistent flow [19]!261; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4262; CHECK-NEXT: da analyze - confused!263; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4264; CHECK-NEXT: da analyze - none!265; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4266; CHECK-NEXT: da analyze - confused!267; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4268; CHECK-NEXT: da analyze - none!269;270entry:271 br label %for.body272 273for.body: ; preds = %entry, %for.body274 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]275 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]276 %conv = trunc i64 %i.02 to i32277 %add = add i64 %i.02, 19278 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add279 store i32 %conv, ptr %arrayidx, align 4280 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02281 %0 = load i32, ptr %arrayidx1, align 4282 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1283 store i32 %0, ptr %B.addr.01, align 4284 %inc = add i64 %i.02, 1285 %exitcond = icmp ne i64 %inc, 20286 br i1 %exitcond, label %for.body, label %for.end287 288for.end: ; preds = %for.body289 ret void290}291 292 293;; for (long unsigned i = 0; i < 20; i++) {294;; A[2*i + 6] = i;295;; *B++ = A[2*i];296 297define void @strong6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {298; CHECK-LABEL: 'strong6'299; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4300; CHECK-NEXT: da analyze - none!301; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4302; CHECK-NEXT: da analyze - consistent flow [3]!303; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4304; CHECK-NEXT: da analyze - confused!305; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4306; CHECK-NEXT: da analyze - none!307; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4308; CHECK-NEXT: da analyze - confused!309; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4310; CHECK-NEXT: da analyze - none!311;312entry:313 br label %for.body314 315for.body: ; preds = %entry, %for.body316 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]317 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]318 %conv = trunc i64 %i.02 to i32319 %mul = shl i64 %i.02, 1320 %add = add i64 %mul, 6321 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add322 store i32 %conv, ptr %arrayidx, align 4323 %mul1 = shl i64 %i.02, 1324 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %mul1325 %0 = load i32, ptr %arrayidx2, align 4326 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1327 store i32 %0, ptr %B.addr.01, align 4328 %inc = add i64 %i.02, 1329 %exitcond = icmp ne i64 %inc, 20330 br i1 %exitcond, label %for.body, label %for.end331 332for.end: ; preds = %for.body333 ret void334}335 336 337;; for (long unsigned i = 0; i < 20; i++) {338;; A[2*i + 7] = i;339;; *B++ = A[2*i];340 341define void @strong7(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {342; CHECK-LABEL: 'strong7'343; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4344; CHECK-NEXT: da analyze - none!345; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4346; CHECK-NEXT: da analyze - none!347; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4348; CHECK-NEXT: da analyze - confused!349; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4350; CHECK-NEXT: da analyze - none!351; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4352; CHECK-NEXT: da analyze - confused!353; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4354; CHECK-NEXT: da analyze - none!355;356entry:357 br label %for.body358 359for.body: ; preds = %entry, %for.body360 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]361 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]362 %conv = trunc i64 %i.02 to i32363 %mul = shl i64 %i.02, 1364 %add = add i64 %mul, 7365 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add366 store i32 %conv, ptr %arrayidx, align 4367 %mul1 = shl i64 %i.02, 1368 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %mul1369 %0 = load i32, ptr %arrayidx2, align 4370 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1371 store i32 %0, ptr %B.addr.01, align 4372 %inc = add i64 %i.02, 1373 %exitcond = icmp ne i64 %inc, 20374 br i1 %exitcond, label %for.body, label %for.end375 376for.end: ; preds = %for.body377 ret void378}379 380 381;; for (long unsigned i = 0; i < 20; i++) {382;; A[i + n] = i;383;; *B++ = A[i];384 385define void @strong8(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {386; CHECK-LABEL: 'strong8'387; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4388; CHECK-NEXT: da analyze - none!389; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4390; CHECK-NEXT: da analyze - flow [*|<]!391; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4392; CHECK-NEXT: da analyze - confused!393; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4394; CHECK-NEXT: da analyze - none!395; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4396; CHECK-NEXT: da analyze - confused!397; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4398; CHECK-NEXT: da analyze - none!399;400entry:401 br label %for.body402 403for.body: ; preds = %entry, %for.body404 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]405 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]406 %conv = trunc i64 %i.02 to i32407 %add = add i64 %i.02, %n408 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add409 store i32 %conv, ptr %arrayidx, align 4410 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %i.02411 %0 = load i32, ptr %arrayidx1, align 4412 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1413 store i32 %0, ptr %B.addr.01, align 4414 %inc = add i64 %i.02, 1415 %exitcond = icmp ne i64 %inc, 20416 br i1 %exitcond, label %for.body, label %for.end417 418for.end: ; preds = %for.body419 ret void420}421 422 423;; for (long unsigned i = 0; i < n; i++) {424;; A[i + n] = i;425;; *B++ = A[i + 2*n];426 427define void @strong9(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {428; CHECK-ALL-LABEL: 'strong9'429; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4430; CHECK-ALL-NEXT: da analyze - none!431; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4432; CHECK-ALL-NEXT: da analyze - none!433; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4434; CHECK-ALL-NEXT: da analyze - confused!435; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4436; CHECK-ALL-NEXT: da analyze - none!437; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4438; CHECK-ALL-NEXT: da analyze - confused!439; CHECK-ALL-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4440; CHECK-ALL-NEXT: da analyze - none!441;442; CHECK-STRONG-SIV-LABEL: 'strong9'443; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4444; CHECK-STRONG-SIV-NEXT: da analyze - none!445; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4446; CHECK-STRONG-SIV-NEXT: da analyze - flow [*|<]!447; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4448; CHECK-STRONG-SIV-NEXT: da analyze - confused!449; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4450; CHECK-STRONG-SIV-NEXT: da analyze - none!451; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4452; CHECK-STRONG-SIV-NEXT: da analyze - confused!453; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4454; CHECK-STRONG-SIV-NEXT: da analyze - none!455;456entry:457 %cmp1 = icmp eq i64 %n, 0458 br i1 %cmp1, label %for.end, label %for.body.preheader459 460for.body.preheader: ; preds = %entry461 br label %for.body462 463for.body: ; preds = %for.body.preheader, %for.body464 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]465 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]466 %conv = trunc i64 %i.03 to i32467 %add = add i64 %i.03, %n468 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add469 store i32 %conv, ptr %arrayidx, align 4470 %mul = shl i64 %n, 1471 %add1 = add i64 %i.03, %mul472 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %add1473 %0 = load i32, ptr %arrayidx2, align 4474 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1475 store i32 %0, ptr %B.addr.02, align 4476 %inc = add i64 %i.03, 1477 %exitcond = icmp ne i64 %inc, %n478 br i1 %exitcond, label %for.body, label %for.end.loopexit479 480for.end.loopexit: ; preds = %for.body481 br label %for.end482 483for.end: ; preds = %for.end.loopexit, %entry484 ret void485}486 487 488;; for (long unsigned i = 0; i < 1000; i++) {489;; A[n*i + 5] = i;490;; *B++ = A[n*i + 5];491 492define void @strong10(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {493; CHECK-LABEL: 'strong10'494; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4495; CHECK-NEXT: da analyze - none!496; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4497; CHECK-NEXT: da analyze - consistent flow [0|<]!498; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4499; CHECK-NEXT: da analyze - confused!500; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4501; CHECK-NEXT: da analyze - none!502; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4503; CHECK-NEXT: da analyze - confused!504; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4505; CHECK-NEXT: da analyze - none!506;507entry:508 br label %for.body509 510for.body: ; preds = %entry, %for.body511 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]512 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]513 %conv = trunc i64 %i.02 to i32514 %mul = mul i64 %i.02, %n515 %add = add i64 %mul, 5516 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add517 store i32 %conv, ptr %arrayidx, align 4518 %mul1 = mul i64 %i.02, %n519 %add2 = add i64 %mul1, 5520 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add2521 %0 = load i32, ptr %arrayidx3, align 4522 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1523 store i32 %0, ptr %B.addr.01, align 4524 %inc = add i64 %i.02, 1525 %exitcond = icmp ne i64 %inc, 1000526 br i1 %exitcond, label %for.body, label %for.end527 528for.end: ; preds = %for.body529 ret void530}531 532 533;; for (long unsigned i = 0; i < 9223372036854775806; i++)534;; for (long unsigned j = 0; j < 2147483640; j++)535;; if (i < 3000000000)536;; A[i] = 0;537 538define void @strong11(ptr %A) nounwind uwtable ssp {539; CHECK-LABEL: 'strong11'540; CHECK-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 4541; CHECK-NEXT: da analyze - consistent output [0 S]!542;543entry:544 br label %for.cond1.preheader545 546for.cond1.preheader: ; preds = %entry, %for.cond.cleanup3547 %i.017 = phi i64 [ 0, %entry ], [ %inc8, %for.cond.cleanup3 ]548 %cmp5 = icmp samesign ult i64 %i.017, 3000000000549 %arrayidx = getelementptr inbounds nuw i32, ptr %A, i64 %i.017550 br i1 %cmp5, label %for.body4.us, label %for.cond.cleanup3551 552for.body4.us: ; preds = %for.cond1.preheader, %for.body4.us553 %j.016.us = phi i64 [ %inc.us, %for.body4.us ], [ 0, %for.cond1.preheader ]554 store i32 0, ptr %arrayidx, align 4555 %inc.us = add nuw nsw i64 %j.016.us, 1556 %exitcond.not = icmp eq i64 %inc.us, 2147483640557 br i1 %exitcond.not, label %for.cond.cleanup3, label %for.body4.us558 559for.cond.cleanup: ; preds = %for.cond.cleanup3560 ret void561 562for.cond.cleanup3: ; preds = %for.body4.us, %for.cond1.preheader563 %inc8 = add nuw nsw i64 %i.017, 1564 %exitcond19.not = icmp eq i64 %inc8, 9223372036854775806565 br i1 %exitcond19.not, label %for.cond.cleanup, label %for.cond1.preheader566}567