724 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 int i = 0; i < 100; i++)10;; for (long int j = 0; j ptr|<]!11;; for (long int j = 0; j < 100; j++) {12;; A[2*i - 4*j] = i;13;; *B++ = A[6*i + 8*j];14 15define void @gcd0(ptr %A, ptr %B) nounwind uwtable ssp {16; CHECK-LABEL: 'gcd0'17; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 418; CHECK-NEXT: da analyze - output [* *]!19; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 420; CHECK-NEXT: da analyze - flow [=> *|<]!21; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 422; CHECK-NEXT: da analyze - confused!23; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 424; CHECK-NEXT: da analyze - input [* *]!25; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 426; CHECK-NEXT: da analyze - confused!27; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 428; CHECK-NEXT: da analyze - none!29;30entry:31 br label %for.cond1.preheader32 33for.cond1.preheader: ; preds = %entry, %for.inc834 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc8 ]35 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]36 br label %for.body337 38for.body3: ; preds = %for.cond1.preheader, %for.body339 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]40 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]41 %conv = trunc i64 %i.03 to i3242 %mul = shl nsw i64 %i.03, 143 %mul4 = shl nsw i64 %j.02, 244 %sub = sub nsw i64 %mul, %mul445 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub46 store i32 %conv, ptr %arrayidx, align 447 %mul5 = mul nsw i64 %i.03, 648 %mul6 = shl nsw i64 %j.02, 349 %add = add nsw i64 %mul5, %mul650 %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add51 %0 = load i32, ptr %arrayidx7, align 452 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 153 store i32 %0, ptr %B.addr.11, align 454 %inc = add nsw i64 %j.02, 155 %exitcond = icmp ne i64 %inc, 10056 br i1 %exitcond, label %for.body3, label %for.inc857 58for.inc8: ; preds = %for.body359 %scevgep = getelementptr i32, ptr %B.addr.04, i64 10060 %inc9 = add nsw i64 %i.03, 161 %exitcond5 = icmp ne i64 %inc9, 10062 br i1 %exitcond5, label %for.cond1.preheader, label %for.end1063 64for.end10: ; preds = %for.inc865 ret void66}67 68 69;; for (long int i = 0; i < 100; i++)70;; for (long int j = 0; j < 100; j++) {71;; A[2*i - 4*j] = i;72;; *B++ = A[6*i + 8*j + 1];73 74define void @gcd1(ptr %A, ptr %B) nounwind uwtable ssp {75; CHECK-LABEL: 'gcd1'76; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 477; CHECK-NEXT: da analyze - output [* *]!78; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 479; CHECK-NEXT: da analyze - none!80; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 481; CHECK-NEXT: da analyze - confused!82; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 483; CHECK-NEXT: da analyze - input [* *]!84; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 485; CHECK-NEXT: da analyze - confused!86; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 487; CHECK-NEXT: da analyze - none!88;89entry:90 br label %for.cond1.preheader91 92for.cond1.preheader: ; preds = %entry, %for.inc993 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]94 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]95 br label %for.body396 97for.body3: ; preds = %for.cond1.preheader, %for.body398 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]99 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]100 %conv = trunc i64 %i.03 to i32101 %mul = shl nsw i64 %i.03, 1102 %mul4 = shl nsw i64 %j.02, 2103 %sub = sub nsw i64 %mul, %mul4104 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub105 store i32 %conv, ptr %arrayidx, align 4106 %mul5 = mul nsw i64 %i.03, 6107 %mul6 = shl nsw i64 %j.02, 3108 %add = add nsw i64 %mul5, %mul6109 %add7 = or disjoint i64 %add, 1110 %arrayidx8 = getelementptr inbounds i32, ptr %A, i64 %add7111 %0 = load i32, ptr %arrayidx8, align 4112 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1113 store i32 %0, ptr %B.addr.11, align 4114 %inc = add nsw i64 %j.02, 1115 %exitcond = icmp ne i64 %inc, 100116 br i1 %exitcond, label %for.body3, label %for.inc9117 118for.inc9: ; preds = %for.body3119 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100120 %inc10 = add nsw i64 %i.03, 1121 %exitcond5 = icmp ne i64 %inc10, 100122 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11123 124for.end11: ; preds = %for.inc9125 ret void126}127 128 129;; for (long int i = 0; i < 100; i++)130;; for (long int j = 0; j < 100; j++) {131;; A[2*i - 4*j + 1] = i;132;; *B++ = A[6*i + 8*j];133 134define void @gcd2(ptr %A, ptr %B) nounwind uwtable ssp {135; CHECK-LABEL: 'gcd2'136; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4137; CHECK-NEXT: da analyze - output [* *]!138; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4139; CHECK-NEXT: da analyze - none!140; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4141; CHECK-NEXT: da analyze - confused!142; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4143; CHECK-NEXT: da analyze - input [* *]!144; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4145; CHECK-NEXT: da analyze - confused!146; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4147; CHECK-NEXT: da analyze - none!148;149entry:150 br label %for.cond1.preheader151 152for.cond1.preheader: ; preds = %entry, %for.inc9153 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]154 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]155 br label %for.body3156 157for.body3: ; preds = %for.cond1.preheader, %for.body3158 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]159 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]160 %conv = trunc i64 %i.03 to i32161 %mul = shl nsw i64 %i.03, 1162 %mul4 = shl nsw i64 %j.02, 2163 %sub = sub nsw i64 %mul, %mul4164 %add5 = or disjoint i64 %sub, 1165 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add5166 store i32 %conv, ptr %arrayidx, align 4167 %mul5 = mul nsw i64 %i.03, 6168 %mul6 = shl nsw i64 %j.02, 3169 %add7 = add nsw i64 %mul5, %mul6170 %arrayidx8 = getelementptr inbounds i32, ptr %A, i64 %add7171 %0 = load i32, ptr %arrayidx8, align 4172 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1173 store i32 %0, ptr %B.addr.11, align 4174 %inc = add nsw i64 %j.02, 1175 %exitcond = icmp ne i64 %inc, 100176 br i1 %exitcond, label %for.body3, label %for.inc9177 178for.inc9: ; preds = %for.body3179 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100180 %inc10 = add nsw i64 %i.03, 1181 %exitcond6 = icmp ne i64 %inc10, 100182 br i1 %exitcond6, label %for.cond1.preheader, label %for.end11183 184for.end11: ; preds = %for.inc9185 ret void186}187 188 189;; for (long int i = 0; i < 100; i++)190;; for (long int j = 0; j < 100; j++) {191;; A[i + 2*j] = i;192;; *B++ = A[i + 2*j - 1];193 194define void @gcd3(ptr %A, ptr %B) nounwind uwtable ssp {195; CHECK-LABEL: 'gcd3'196; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4197; CHECK-NEXT: da analyze - output [* *]!198; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4199; CHECK-NEXT: da analyze - flow [<> *]!200; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4201; CHECK-NEXT: da analyze - confused!202; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4203; CHECK-NEXT: da analyze - input [* *]!204; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx6, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4205; CHECK-NEXT: da analyze - confused!206; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4207; CHECK-NEXT: da analyze - none!208;209entry:210 br label %for.cond1.preheader211 212for.cond1.preheader: ; preds = %entry, %for.inc7213 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc7 ]214 %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]215 br label %for.body3216 217for.body3: ; preds = %for.cond1.preheader, %for.body3218 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]219 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]220 %conv = trunc i64 %i.03 to i32221 %mul = shl nsw i64 %j.02, 1222 %add = add nsw i64 %i.03, %mul223 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add224 store i32 %conv, ptr %arrayidx, align 4225 %mul4 = shl nsw i64 %j.02, 1226 %add5 = add nsw i64 %i.03, %mul4227 %sub = add nsw i64 %add5, -1228 %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %sub229 %0 = load i32, ptr %arrayidx6, align 4230 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1231 store i32 %0, ptr %B.addr.11, align 4232 %inc = add nsw i64 %j.02, 1233 %exitcond = icmp ne i64 %inc, 100234 br i1 %exitcond, label %for.body3, label %for.inc7235 236for.inc7: ; preds = %for.body3237 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100238 %inc8 = add nsw i64 %i.03, 1239 %exitcond5 = icmp ne i64 %inc8, 100240 br i1 %exitcond5, label %for.cond1.preheader, label %for.end9241 242for.end9: ; preds = %for.inc7243 ret void244}245 246 247;; for (long int i = 0; i < 100; i++)248;; for (long int j = 0; j < 100; j++) {249;; A[5*i + 10*j*M + 9*M*N] = i;250;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];251 252define void @gcd4(ptr %A, ptr %B, i64 %M, i64 %N) nounwind uwtable ssp {253; CHECK-LABEL: 'gcd4'254; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4255; CHECK-NEXT: da analyze - output [* *]!256; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx16, align 4257; CHECK-NEXT: da analyze - flow [* *|<]!258; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4259; CHECK-NEXT: da analyze - confused!260; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx16, align 4 --> Dst: %0 = load i32, ptr %arrayidx16, align 4261; CHECK-NEXT: da analyze - input [* *]!262; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx16, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4263; CHECK-NEXT: da analyze - confused!264; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4265; CHECK-NEXT: da analyze - none!266;267entry:268 br label %for.cond1.preheader269 270for.cond1.preheader: ; preds = %entry, %for.inc17271 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc17 ]272 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]273 br label %for.body3274 275for.body3: ; preds = %for.cond1.preheader, %for.body3276 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]277 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]278 %conv = trunc i64 %i.03 to i32279 %mul = mul nsw i64 %i.03, 5280 %mul4 = mul nsw i64 %j.02, 10281 %mul5 = mul nsw i64 %mul4, %M282 %add = add nsw i64 %mul, %mul5283 %mul6 = mul nsw i64 %M, 9284 %mul7 = mul nsw i64 %mul6, %N285 %add8 = add nsw i64 %add, %mul7286 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add8287 store i32 %conv, ptr %arrayidx, align 4288 %mul9 = mul nsw i64 %i.03, 15289 %mul10 = mul nsw i64 %j.02, 20290 %mul11 = mul nsw i64 %mul10, %M291 %add12 = add nsw i64 %mul9, %mul11292 %mul13 = mul nsw i64 %N, 21293 %mul14 = mul nsw i64 %mul13, %M294 %sub = sub nsw i64 %add12, %mul14295 %add15 = add nsw i64 %sub, 4296 %arrayidx16 = getelementptr inbounds i32, ptr %A, i64 %add15297 %0 = load i32, ptr %arrayidx16, align 4298 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1299 store i32 %0, ptr %B.addr.11, align 4300 %inc = add nsw i64 %j.02, 1301 %exitcond = icmp ne i64 %inc, 100302 br i1 %exitcond, label %for.body3, label %for.inc17303 304for.inc17: ; preds = %for.body3305 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100306 %inc18 = add nsw i64 %i.03, 1307 %exitcond5 = icmp ne i64 %inc18, 100308 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19309 310for.end19: ; preds = %for.inc17311 ret void312}313 314 315;; for (long int i = 0; i < 100; i++)316;; for (long int j = 0; j < 100; j++) {317;; A[5*i + 10*j*M + 9*M*N] = i;318;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];319 320define void @gcd5(ptr %A, ptr %B, i64 %M, i64 %N) nounwind uwtable ssp {321; CHECK-LABEL: 'gcd5'322; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4323; CHECK-NEXT: da analyze - output [* *]!324; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx16, align 4325; CHECK-NEXT: da analyze - flow [* *|<]!326; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4327; CHECK-NEXT: da analyze - confused!328; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx16, align 4 --> Dst: %0 = load i32, ptr %arrayidx16, align 4329; CHECK-NEXT: da analyze - input [* *]!330; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx16, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4331; CHECK-NEXT: da analyze - confused!332; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4333; CHECK-NEXT: da analyze - none!334;335entry:336 br label %for.cond1.preheader337 338for.cond1.preheader: ; preds = %entry, %for.inc17339 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc17 ]340 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]341 br label %for.body3342 343for.body3: ; preds = %for.cond1.preheader, %for.body3344 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]345 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]346 %conv = trunc i64 %i.03 to i32347 %mul = mul nsw i64 %i.03, 5348 %mul4 = mul nsw i64 %j.02, 10349 %mul5 = mul nsw i64 %mul4, %M350 %add = add nsw i64 %mul, %mul5351 %mul6 = mul nsw i64 %M, 9352 %mul7 = mul nsw i64 %mul6, %N353 %add8 = add nsw i64 %add, %mul7354 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add8355 store i32 %conv, ptr %arrayidx, align 4356 %mul9 = mul nsw i64 %i.03, 15357 %mul10 = mul nsw i64 %j.02, 20358 %mul11 = mul nsw i64 %mul10, %M359 %add12 = add nsw i64 %mul9, %mul11360 %mul13 = mul nsw i64 %N, 21361 %mul14 = mul nsw i64 %mul13, %M362 %sub = sub nsw i64 %add12, %mul14363 %add15 = add nsw i64 %sub, 5364 %arrayidx16 = getelementptr inbounds i32, ptr %A, i64 %add15365 %0 = load i32, ptr %arrayidx16, align 4366 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1367 store i32 %0, ptr %B.addr.11, align 4368 %inc = add nsw i64 %j.02, 1369 %exitcond = icmp ne i64 %inc, 100370 br i1 %exitcond, label %for.body3, label %for.inc17371 372for.inc17: ; preds = %for.body3373 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100374 %inc18 = add nsw i64 %i.03, 1375 %exitcond5 = icmp ne i64 %inc18, 100376 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19377 378for.end19: ; preds = %for.inc17379 ret void380}381 382 383;; for (long int i = 0; i < n; i++)384;; for (long int j = 0; j < n; j++) {385;; A[2*i][4*j] = i;386;; *B++ = A[8*i][6*j + 1];387 388define void @gcd6(i64 %n, ptr %A, ptr %B) nounwind uwtable ssp {389; CHECK-LABEL: 'gcd6'390; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %conv, ptr %arrayidx5, align 4391; CHECK-NEXT: da analyze - output [* *]!392; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: %2 = load i32, ptr %arrayidx9, align 4393; CHECK-NEXT: da analyze - flow [* *|<]!394; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %2, ptr %B.addr.12, align 4395; CHECK-NEXT: da analyze - confused!396; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx9, align 4 --> Dst: %2 = load i32, ptr %arrayidx9, align 4397; CHECK-NEXT: da analyze - input [* *]!398; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %2, ptr %B.addr.12, align 4399; CHECK-NEXT: da analyze - confused!400; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.12, align 4 --> Dst: store i32 %2, ptr %B.addr.12, align 4401; CHECK-NEXT: da analyze - confused!402;403entry:404 %cmp4 = icmp sgt i64 %n, 0405 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12406 407for.cond1.preheader.preheader: ; preds = %entry408 br label %for.cond1.preheader409 410for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10411 %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]412 %B.addr.05 = phi ptr [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]413 %cmp21 = icmp sgt i64 %n, 0414 br i1 %cmp21, label %for.body3.preheader, label %for.inc10415 416for.body3.preheader: ; preds = %for.cond1.preheader417 br label %for.body3418 419for.body3: ; preds = %for.body3.preheader, %for.body3420 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]421 %B.addr.12 = phi ptr [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]422 %conv = trunc i64 %i.06 to i32423 %mul = shl nsw i64 %j.03, 2424 %mul4 = shl nsw i64 %i.06, 1425 %0 = mul nsw i64 %mul4, %n426 %arrayidx.sum = add i64 %0, %mul427 %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %arrayidx.sum428 store i32 %conv, ptr %arrayidx5, align 4429 %mul6 = mul nsw i64 %j.03, 6430 %add7 = or disjoint i64 %mul6, 1431 %mul7 = shl nsw i64 %i.06, 3432 %1 = mul nsw i64 %mul7, %n433 %arrayidx8.sum = add i64 %1, %add7434 %arrayidx9 = getelementptr inbounds i32, ptr %A, i64 %arrayidx8.sum435 %2 = load i32, ptr %arrayidx9, align 4436 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.12, i64 1437 store i32 %2, ptr %B.addr.12, align 4438 %inc = add nsw i64 %j.03, 1439 %exitcond = icmp ne i64 %inc, %n440 br i1 %exitcond, label %for.body3, label %for.inc10.loopexit441 442for.inc10.loopexit: ; preds = %for.body3443 %scevgep = getelementptr i32, ptr %B.addr.05, i64 %n444 br label %for.inc10445 446for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader447 %B.addr.1.lcssa = phi ptr [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]448 %inc11 = add nsw i64 %i.06, 1449 %exitcond8 = icmp ne i64 %inc11, %n450 br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit451 452for.end12.loopexit: ; preds = %for.inc10453 br label %for.end12454 455for.end12: ; preds = %for.end12.loopexit, %entry456 ret void457}458 459 460;; for (int i = 0; i < n; i++)461;; for (int j = 0; j < n; j++) {462;; A[2*i][4*j] = i;463;; *B++ = A[8*i][6*j + 1];464 465define void @gcd7(i32 %n, ptr %A, ptr %B) nounwind uwtable ssp {466; CHECK-LABEL: 'gcd7'467; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: store i32 %7, ptr %arrayidx6, align 4468; CHECK-NEXT: da analyze - output [* *]!469; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: %11 = load i32, ptr %arrayidx12, align 4470; CHECK-NEXT: da analyze - flow [* *|<]!471; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4472; CHECK-NEXT: da analyze - confused!473; CHECK-NEXT: Src: %11 = load i32, ptr %arrayidx12, align 4 --> Dst: %11 = load i32, ptr %arrayidx12, align 4474; CHECK-NEXT: da analyze - input [* *]!475; CHECK-NEXT: Src: %11 = load i32, ptr %arrayidx12, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4476; CHECK-NEXT: da analyze - confused!477; CHECK-NEXT: Src: store i32 %11, ptr %B.addr.12, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4478; CHECK-NEXT: da analyze - confused!479;480entry:481 %0 = zext i32 %n to i64482 %cmp4 = icmp sgt i32 %n, 0483 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15484 485for.cond1.preheader.preheader: ; preds = %entry486 br label %for.cond1.preheader487 488for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13489 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]490 %B.addr.05 = phi ptr [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]491 %1 = add i32 %n, -1492 %2 = zext i32 %1 to i64493 %3 = add i64 %2, 1494 %cmp21 = icmp sgt i32 %n, 0495 br i1 %cmp21, label %for.body3.preheader, label %for.inc13496 497for.body3.preheader: ; preds = %for.cond1.preheader498 br label %for.body3499 500for.body3: ; preds = %for.body3.preheader, %for.body3501 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]502 %B.addr.12 = phi ptr [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]503 %4 = trunc i64 %indvars.iv to i32504 %mul = shl nsw i32 %4, 2505 %idxprom = sext i32 %mul to i64506 %5 = trunc i64 %indvars.iv8 to i32507 %mul4 = shl nsw i32 %5, 1508 %idxprom5 = sext i32 %mul4 to i64509 %6 = mul nsw i64 %idxprom5, %0510 %arrayidx.sum = add i64 %6, %idxprom511 %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %arrayidx.sum512 %7 = trunc i64 %indvars.iv8 to i32513 store i32 %7, ptr %arrayidx6, align 4514 %8 = trunc i64 %indvars.iv to i32515 %mul7 = mul nsw i32 %8, 6516 %add7 = or disjoint i32 %mul7, 1517 %idxprom8 = sext i32 %add7 to i64518 %9 = trunc i64 %indvars.iv8 to i32519 %mul9 = shl nsw i32 %9, 3520 %idxprom10 = sext i32 %mul9 to i64521 %10 = mul nsw i64 %idxprom10, %0522 %arrayidx11.sum = add i64 %10, %idxprom8523 %arrayidx12 = getelementptr inbounds i32, ptr %A, i64 %arrayidx11.sum524 %11 = load i32, ptr %arrayidx12, align 4525 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.12, i64 1526 store i32 %11, ptr %B.addr.12, align 4527 %indvars.iv.next = add i64 %indvars.iv, 1528 %lftr.wideiv = trunc i64 %indvars.iv.next to i32529 %exitcond = icmp ne i32 %lftr.wideiv, %n530 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit531 532for.inc13.loopexit: ; preds = %for.body3533 %scevgep = getelementptr i32, ptr %B.addr.05, i64 %3534 br label %for.inc13535 536for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader537 %B.addr.1.lcssa = phi ptr [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]538 %indvars.iv.next9 = add i64 %indvars.iv8, 1539 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32540 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n541 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit542 543for.end15.loopexit: ; preds = %for.inc13544 br label %for.end15545 546for.end15: ; preds = %for.end15.loopexit, %entry547 ret void548}549 550 551;; for (int i = 0; i < n; i++)552;; for (int j = 0; j < n; j++) {553;; A[n*2*i + 4*j] = i;554;; *B++ = A[n*8*i + 6*j + 1];555 556define void @gcd8(i32 %n, ptr %A, ptr %B) nounwind uwtable ssp {557; CHECK-LABEL: 'gcd8'558; CHECK-NEXT: Src: store i32 %i.06, ptr %arrayidx, align 4 --> Dst: store i32 %i.06, ptr %arrayidx, align 4559; CHECK-NEXT: da analyze - output [* *]!560; CHECK-NEXT: Src: store i32 %i.06, ptr %arrayidx, align 4 --> Dst: %5 = load i32, ptr %arrayidx12, align 4561; CHECK-NEXT: da analyze - flow [* *|<]!562; CHECK-NEXT: Src: store i32 %i.06, ptr %arrayidx, align 4 --> Dst: store i32 %5, ptr %B.addr.12, align 4563; CHECK-NEXT: da analyze - confused!564; CHECK-NEXT: Src: %5 = load i32, ptr %arrayidx12, align 4 --> Dst: %5 = load i32, ptr %arrayidx12, align 4565; CHECK-NEXT: da analyze - input [* *]!566; CHECK-NEXT: Src: %5 = load i32, ptr %arrayidx12, align 4 --> Dst: store i32 %5, ptr %B.addr.12, align 4567; CHECK-NEXT: da analyze - confused!568; CHECK-NEXT: Src: store i32 %5, ptr %B.addr.12, align 4 --> Dst: store i32 %5, ptr %B.addr.12, align 4569; CHECK-NEXT: da analyze - confused!570;571entry:572 %cmp4 = icmp sgt i32 %n, 0573 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15574 575for.cond1.preheader.preheader: ; preds = %entry576 br label %for.cond1.preheader577 578for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13579 %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]580 %B.addr.05 = phi ptr [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]581 %0 = add i32 %n, -1582 %1 = zext i32 %0 to i64583 %2 = add i64 %1, 1584 %cmp21 = icmp sgt i32 %n, 0585 br i1 %cmp21, label %for.body3.preheader, label %for.inc13586 587for.body3.preheader: ; preds = %for.cond1.preheader588 br label %for.body3589 590for.body3: ; preds = %for.body3.preheader, %for.body3591 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]592 %B.addr.12 = phi ptr [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]593 %mul = shl nsw i32 %n, 1594 %mul4 = mul nsw i32 %mul, %i.06595 %3 = trunc i64 %indvars.iv to i32596 %mul5 = shl nsw i32 %3, 2597 %add = add nsw i32 %mul4, %mul5598 %idxprom = sext i32 %add to i64599 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %idxprom600 store i32 %i.06, ptr %arrayidx, align 4601 %mul6 = shl nsw i32 %n, 3602 %mul7 = mul nsw i32 %mul6, %i.06603 %4 = trunc i64 %indvars.iv to i32604 %mul8 = mul nsw i32 %4, 6605 %add9 = add nsw i32 %mul7, %mul8606 %add10 = or disjoint i32 %add9, 1607 %idxprom11 = sext i32 %add10 to i64608 %arrayidx12 = getelementptr inbounds i32, ptr %A, i64 %idxprom11609 %5 = load i32, ptr %arrayidx12, align 4610 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.12, i64 1611 store i32 %5, ptr %B.addr.12, align 4612 %indvars.iv.next = add i64 %indvars.iv, 1613 %lftr.wideiv = trunc i64 %indvars.iv.next to i32614 %exitcond = icmp ne i32 %lftr.wideiv, %n615 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit616 617for.inc13.loopexit: ; preds = %for.body3618 %scevgep = getelementptr i32, ptr %B.addr.05, i64 %2619 br label %for.inc13620 621for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader622 %B.addr.1.lcssa = phi ptr [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]623 %inc14 = add nsw i32 %i.06, 1624 %exitcond7 = icmp ne i32 %inc14, %n625 br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit626 627for.end15.loopexit: ; preds = %for.inc13628 br label %for.end15629 630for.end15: ; preds = %for.end15.loopexit, %entry631 ret void632}633 634 635;; for (unsigned i = 0; i < n; i++)636;; for (unsigned j = 0; j < n; j++) {637;; A[2*i][4*j] = i;638;; *B++ = A[8*i][6*j + 1];639 640define void @gcd9(i32 %n, ptr %A, ptr %B) nounwind uwtable ssp {641; CHECK-LABEL: 'gcd9'642; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: store i32 %7, ptr %arrayidx6, align 4643; CHECK-NEXT: da analyze - output [* *]!644; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: %11 = load i32, ptr %arrayidx12, align 4645; CHECK-NEXT: da analyze - flow [* *|<]!646; CHECK-NEXT: Src: store i32 %7, ptr %arrayidx6, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4647; CHECK-NEXT: da analyze - confused!648; CHECK-NEXT: Src: %11 = load i32, ptr %arrayidx12, align 4 --> Dst: %11 = load i32, ptr %arrayidx12, align 4649; CHECK-NEXT: da analyze - input [* *]!650; CHECK-NEXT: Src: %11 = load i32, ptr %arrayidx12, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4651; CHECK-NEXT: da analyze - confused!652; CHECK-NEXT: Src: store i32 %11, ptr %B.addr.12, align 4 --> Dst: store i32 %11, ptr %B.addr.12, align 4653; CHECK-NEXT: da analyze - confused!654;655entry:656 %0 = zext i32 %n to i64657 %cmp4 = icmp eq i32 %n, 0658 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader659 660for.cond1.preheader.preheader: ; preds = %entry661 br label %for.cond1.preheader662 663for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13664 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]665 %B.addr.05 = phi ptr [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]666 %1 = add i32 %n, -1667 %2 = zext i32 %1 to i64668 %3 = add i64 %2, 1669 %cmp21 = icmp eq i32 %n, 0670 br i1 %cmp21, label %for.inc13, label %for.body3.preheader671 672for.body3.preheader: ; preds = %for.cond1.preheader673 br label %for.body3674 675for.body3: ; preds = %for.body3.preheader, %for.body3676 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]677 %B.addr.12 = phi ptr [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]678 %4 = trunc i64 %indvars.iv to i32679 %mul = shl i32 %4, 2680 %idxprom = zext i32 %mul to i64681 %5 = trunc i64 %indvars.iv8 to i32682 %mul4 = shl i32 %5, 1683 %idxprom5 = zext i32 %mul4 to i64684 %6 = mul nsw i64 %idxprom5, %0685 %arrayidx.sum = add i64 %6, %idxprom686 %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %arrayidx.sum687 %7 = trunc i64 %indvars.iv8 to i32688 store i32 %7, ptr %arrayidx6, align 4689 %8 = trunc i64 %indvars.iv to i32690 %mul7 = mul i32 %8, 6691 %add7 = or disjoint i32 %mul7, 1692 %idxprom8 = zext i32 %add7 to i64693 %9 = trunc i64 %indvars.iv8 to i32694 %mul9 = shl i32 %9, 3695 %idxprom10 = zext i32 %mul9 to i64696 %10 = mul nsw i64 %idxprom10, %0697 %arrayidx11.sum = add i64 %10, %idxprom8698 %arrayidx12 = getelementptr inbounds i32, ptr %A, i64 %arrayidx11.sum699 %11 = load i32, ptr %arrayidx12, align 4700 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.12, i64 1701 store i32 %11, ptr %B.addr.12, align 4702 %indvars.iv.next = add i64 %indvars.iv, 1703 %lftr.wideiv = trunc i64 %indvars.iv.next to i32704 %exitcond = icmp ne i32 %lftr.wideiv, %n705 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit706 707for.inc13.loopexit: ; preds = %for.body3708 %scevgep = getelementptr i32, ptr %B.addr.05, i64 %3709 br label %for.inc13710 711for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader712 %B.addr.1.lcssa = phi ptr [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]713 %indvars.iv.next9 = add i64 %indvars.iv8, 1714 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32715 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n716 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit717 718for.end15.loopexit: ; preds = %for.inc13719 br label %for.end15720 721for.end15: ; preds = %for.end15.loopexit, %entry722 ret void723}724