606 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 < 100; j++) {11;; A[i + 1][i + j] = i;12;; *B++ = A[i][i + j];13 14define void @prop0(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {15; CHECK-LABEL: 'prop0'16; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %conv, ptr %arrayidx5, align 417; CHECK-NEXT: da analyze - none!18; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 419; CHECK-NEXT: da analyze - flow [< >]!20; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 421; CHECK-NEXT: da analyze - confused!22; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 423; CHECK-NEXT: da analyze - none!24; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 425; CHECK-NEXT: da analyze - confused!26; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 427; CHECK-NEXT: da analyze - none!28;29entry:30 br label %for.cond1.preheader31 32for.cond1.preheader: ; preds = %entry, %for.inc933 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]34 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]35 br label %for.body336 37for.body3: ; preds = %for.cond1.preheader, %for.body338 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]39 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]40 %conv = trunc i64 %i.03 to i3241 %add = add nsw i64 %i.03, %j.0242 %add4 = add nsw i64 %i.03, 143 %arrayidx5 = getelementptr inbounds [100 x i32], ptr %A, i64 %add4, i64 %add44 store i32 %conv, ptr %arrayidx5, align 445 %add6 = add nsw i64 %i.03, %j.0246 %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add647 %0 = load i32, ptr %arrayidx8, align 448 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 149 store i32 %0, ptr %B.addr.11, align 450 %inc = add nsw i64 %j.02, 151 %exitcond = icmp ne i64 %inc, 10052 br i1 %exitcond, label %for.body3, label %for.inc953 54for.inc9: ; preds = %for.body355 %scevgep = getelementptr i32, ptr %B.addr.04, i64 10056 %inc10 = add nsw i64 %i.03, 157 %exitcond5 = icmp ne i64 %inc10, 10058 br i1 %exitcond5, label %for.cond1.preheader, label %for.end1159 60for.end11: ; preds = %for.inc961 ret void62}63 64 65;; for (long int i = 0; i < 100; i++)66;; for (long int j = 0; j < 100; j++)67;; for (long int k = 0; k < 100; k++) {68;; A[j - i][i + 1][j + k] = i;69;; *B++ = A[j - i][i][j + k];70 71define void @prop1(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {72; CHECK-LABEL: 'prop1'73; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: store i32 %conv, ptr %arrayidx9, align 474; CHECK-NEXT: da analyze - output [* * *]!75; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 476; CHECK-NEXT: da analyze - flow [<> <> *]!77; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 478; CHECK-NEXT: da analyze - confused!79; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx14, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 480; CHECK-NEXT: da analyze - input [* * *]!81; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx14, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 482; CHECK-NEXT: da analyze - confused!83; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.21, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 484; CHECK-NEXT: da analyze - none!85;86entry:87 br label %for.cond1.preheader88 89for.cond1.preheader: ; preds = %entry, %for.inc1890 %B.addr.06 = phi ptr [ %B, %entry ], [ %scevgep7, %for.inc18 ]91 %i.05 = phi i64 [ 0, %entry ], [ %inc19, %for.inc18 ]92 br label %for.cond4.preheader93 94for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc1595 %B.addr.14 = phi ptr [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc15 ]96 %j.03 = phi i64 [ 0, %for.cond1.preheader ], [ %inc16, %for.inc15 ]97 br label %for.body698 99for.body6: ; preds = %for.cond4.preheader, %for.body6100 %k.02 = phi i64 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]101 %B.addr.21 = phi ptr [ %B.addr.14, %for.cond4.preheader ], [ %incdec.ptr, %for.body6 ]102 %conv = trunc i64 %i.05 to i32103 %add = add nsw i64 %j.03, %k.02104 %add7 = add nsw i64 %i.05, 1105 %sub = sub nsw i64 %j.03, %i.05106 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub, i64 %add7, i64 %add107 store i32 %conv, ptr %arrayidx9, align 4108 %add10 = add nsw i64 %j.03, %k.02109 %sub11 = sub nsw i64 %j.03, %i.05110 %arrayidx14 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub11, i64 %i.05, i64 %add10111 %0 = load i32, ptr %arrayidx14, align 4112 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.21, i64 1113 store i32 %0, ptr %B.addr.21, align 4114 %inc = add nsw i64 %k.02, 1115 %exitcond = icmp ne i64 %inc, 100116 br i1 %exitcond, label %for.body6, label %for.inc15117 118for.inc15: ; preds = %for.body6119 %scevgep = getelementptr i32, ptr %B.addr.14, i64 100120 %inc16 = add nsw i64 %j.03, 1121 %exitcond8 = icmp ne i64 %inc16, 100122 br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18123 124for.inc18: ; preds = %for.inc15125 %scevgep7 = getelementptr i32, ptr %B.addr.06, i64 10000126 %inc19 = add nsw i64 %i.05, 1127 %exitcond9 = icmp ne i64 %inc19, 100128 br i1 %exitcond9, label %for.cond1.preheader, label %for.end20129 130for.end20: ; preds = %for.inc18131 ret void132}133 134 135;; for (long int i = 0; i < 100; i++)136;; for (long int j = 0; j ptr]!137;; for (long int j = 0; j < 100; j++) {138;; A[i - 1][2*i] = i;139;; *B++ = A[i][i + j + 110];140 141define void @prop2(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {142; CHECK-LABEL: 'prop2'143; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4144; CHECK-NEXT: da analyze - consistent output [0 S]!145; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4146; CHECK-NEXT: da analyze - flow [> *]!147; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4148; CHECK-NEXT: da analyze - confused!149; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4150; CHECK-NEXT: da analyze - none!151; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4152; CHECK-NEXT: da analyze - confused!153; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4154; CHECK-NEXT: da analyze - none!155;156entry:157 br label %for.cond1.preheader158 159for.cond1.preheader: ; preds = %entry, %for.inc8160 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc8 ]161 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]162 br label %for.body3163 164for.body3: ; preds = %for.cond1.preheader, %for.body3165 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]166 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]167 %conv = trunc i64 %i.03 to i32168 %mul = shl nsw i64 %i.03, 1169 %sub = add nsw i64 %i.03, -1170 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %sub, i64 %mul171 store i32 %conv, ptr %arrayidx4, align 4172 %add = add nsw i64 %i.03, %j.02173 %add5 = add nsw i64 %add, 110174 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add5175 %0 = load i32, ptr %arrayidx7, align 4176 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1177 store i32 %0, ptr %B.addr.11, align 4178 %inc = add nsw i64 %j.02, 1179 %exitcond = icmp ne i64 %inc, 100180 br i1 %exitcond, label %for.body3, label %for.inc8181 182for.inc8: ; preds = %for.body3183 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100184 %inc9 = add nsw i64 %i.03, 1185 %exitcond5 = icmp ne i64 %inc9, 100186 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10187 188for.end10: ; preds = %for.inc8189 ret void190}191 192 193;; for (long int i = 0; i < 100; i++)194;; for (long int j = 0; j < 100; j++) {195;; A[i][2*j + i] = i;196;; *B++ = A[i][2*j - i + 5];197 198define void @prop3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {199; CHECK-LABEL: 'prop3'200; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4201; CHECK-NEXT: da analyze - output [* *]!202; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4203; CHECK-NEXT: da analyze - flow [<> *]!204; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4205; CHECK-NEXT: da analyze - confused!206; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4207; CHECK-NEXT: da analyze - input [* *]!208; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4209; CHECK-NEXT: da analyze - confused!210; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4211; CHECK-NEXT: da analyze - none!212;213entry:214 br label %for.cond1.preheader215 216for.cond1.preheader: ; preds = %entry, %for.inc9217 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]218 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]219 br label %for.body3220 221for.body3: ; preds = %for.cond1.preheader, %for.body3222 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]223 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]224 %conv = trunc i64 %i.03 to i32225 %mul = shl nsw i64 %j.02, 1226 %add = add nsw i64 %mul, %i.03227 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add228 store i32 %conv, ptr %arrayidx4, align 4229 %mul5 = shl nsw i64 %j.02, 1230 %sub = sub nsw i64 %mul5, %i.03231 %add6 = add nsw i64 %sub, 5232 %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add6233 %0 = load i32, ptr %arrayidx8, align 4234 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1235 store i32 %0, ptr %B.addr.11, align 4236 %inc = add nsw i64 %j.02, 1237 %exitcond = icmp ne i64 %inc, 100238 br i1 %exitcond, label %for.body3, label %for.inc9239 240for.inc9: ; preds = %for.body3241 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100242 %inc10 = add nsw i64 %i.03, 1243 %exitcond5 = icmp ne i64 %inc10, 100244 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11245 246for.end11: ; preds = %for.inc9247 ret void248}249 250 251;; for (long int i = 0; i < 100; i++)252;; for (long int j = 0; j < 100; j++) {253;; A[i + 2][2*i + j + 1] = i;254;; *B++ = A[i][2*i + j];255 256define void @prop4(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {257; CHECK-LABEL: 'prop4'258; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %conv, ptr %arrayidx6, align 4259; CHECK-NEXT: da analyze - none!260; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4261; CHECK-NEXT: da analyze - flow [< <>]!262; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4263; CHECK-NEXT: da analyze - confused!264; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx10, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4265; CHECK-NEXT: da analyze - none!266; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx10, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4267; CHECK-NEXT: da analyze - confused!268; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4269; CHECK-NEXT: da analyze - none!270;271entry:272 br label %for.cond1.preheader273 274for.cond1.preheader: ; preds = %entry, %for.inc11275 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc11 ]276 %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ]277 br label %for.body3278 279for.body3: ; preds = %for.cond1.preheader, %for.body3280 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]281 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]282 %conv = trunc i64 %i.03 to i32283 %mul = shl nsw i64 %i.03, 1284 %add = add nsw i64 %mul, %j.02285 %add4 = add nsw i64 %add, 1286 %add5 = add nsw i64 %i.03, 2287 %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4288 store i32 %conv, ptr %arrayidx6, align 4289 %mul7 = shl nsw i64 %i.03, 1290 %add8 = add nsw i64 %mul7, %j.02291 %arrayidx10 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add8292 %0 = load i32, ptr %arrayidx10, align 4293 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1294 store i32 %0, ptr %B.addr.11, align 4295 %inc = add nsw i64 %j.02, 1296 %exitcond = icmp ne i64 %inc, 100297 br i1 %exitcond, label %for.body3, label %for.inc11298 299for.inc11: ; preds = %for.body3300 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100301 %inc12 = add nsw i64 %i.03, 1302 %exitcond5 = icmp ne i64 %inc12, 100303 br i1 %exitcond5, label %for.cond1.preheader, label %for.end13304 305for.end13: ; preds = %for.inc11306 ret void307}308 309 310;; for (long int i = 0; i < 100; i++)311;; for (long int j = 0; j < 100; j++) {312;; A[3*i - 18][22 - i][2*i + j] = i;313;; *B++ = A[i][i][3*i + j];314 315define void @prop5(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {316; CHECK-LABEL: 'prop5'317; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4318; CHECK-NEXT: da analyze - none!319; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4320; CHECK-NEXT: da analyze - flow [* *|<]!321; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4322; CHECK-NEXT: da analyze - confused!323; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx12, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4324; CHECK-NEXT: da analyze - none!325; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx12, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4326; CHECK-NEXT: da analyze - confused!327; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4328; CHECK-NEXT: da analyze - none!329;330entry:331 br label %for.cond1.preheader332 333for.cond1.preheader: ; preds = %entry, %for.inc13334 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc13 ]335 %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ]336 br label %for.body3337 338for.body3: ; preds = %for.cond1.preheader, %for.body3339 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]340 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]341 %conv = trunc i64 %i.03 to i32342 %mul = shl nsw i64 %i.03, 1343 %add = add nsw i64 %mul, %j.02344 %sub = sub nsw i64 22, %i.03345 %mul4 = mul nsw i64 %i.03, 3346 %sub5 = add nsw i64 %mul4, -18347 %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub5, i64 %sub, i64 %add348 store i32 %conv, ptr %arrayidx7, align 4349 %mul8 = mul nsw i64 %i.03, 3350 %add9 = add nsw i64 %mul8, %j.02351 %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %i.03, i64 %i.03, i64 %add9352 %0 = load i32, ptr %arrayidx12, align 4353 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1354 store i32 %0, ptr %B.addr.11, align 4355 %inc = add nsw i64 %j.02, 1356 %exitcond = icmp ne i64 %inc, 100357 br i1 %exitcond, label %for.body3, label %for.inc13358 359for.inc13: ; preds = %for.body3360 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100361 %inc14 = add nsw i64 %i.03, 1362 %exitcond5 = icmp ne i64 %inc14, 100363 br i1 %exitcond5, label %for.cond1.preheader, label %for.end15364 365for.end15: ; preds = %for.inc13366 ret void367}368 369 370;; for (long int i = 0; i < 100; i++)371;; for (long int j = 0; j < 100; j++) {372;; A[i + 1][4*i + j + 2] = i;373;; *B++ = A[2*i][8*i + j];374 375define void @prop6(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {376; CHECK-LABEL: 'prop6'377; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %conv, ptr %arrayidx6, align 4378; CHECK-NEXT: da analyze - none!379; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4380; CHECK-NEXT: da analyze - flow [=> <>]!381; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4382; CHECK-NEXT: da analyze - confused!383; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx11, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4384; CHECK-NEXT: da analyze - none!385; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4386; CHECK-NEXT: da analyze - confused!387; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4388; CHECK-NEXT: da analyze - none!389;390entry:391 br label %for.cond1.preheader392 393for.cond1.preheader: ; preds = %entry, %for.inc12394 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc12 ]395 %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ]396 br label %for.body3397 398for.body3: ; preds = %for.cond1.preheader, %for.body3399 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]400 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]401 %conv = trunc i64 %i.03 to i32402 %mul = shl nsw i64 %i.03, 2403 %add = add nsw i64 %mul, %j.02404 %add4 = add nsw i64 %add, 2405 %add5 = add nsw i64 %i.03, 1406 %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4407 store i32 %conv, ptr %arrayidx6, align 4408 %mul7 = shl nsw i64 %i.03, 3409 %add8 = add nsw i64 %mul7, %j.02410 %mul9 = shl nsw i64 %i.03, 1411 %arrayidx11 = getelementptr inbounds [100 x i32], ptr %A, i64 %mul9, i64 %add8412 %0 = load i32, ptr %arrayidx11, align 4413 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1414 store i32 %0, ptr %B.addr.11, align 4415 %inc = add nsw i64 %j.02, 1416 %exitcond = icmp ne i64 %inc, 100417 br i1 %exitcond, label %for.body3, label %for.inc12418 419for.inc12: ; preds = %for.body3420 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100421 %inc13 = add nsw i64 %i.03, 1422 %exitcond5 = icmp ne i64 %inc13, 100423 br i1 %exitcond5, label %for.cond1.preheader, label %for.end14424 425for.end14: ; preds = %for.inc12426 ret void427}428 429 430;; for (long int i = 0; i < 100; i++)431;; for (long int j = 0; j < 100; j++) {432;; A[2*i + 4][-5*i + j + 2] = i;433;; *B++ = A[-2*i + 20][5*i + j];434 435define void @prop7(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {436; CHECK-LABEL: 'prop7'437; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4438; CHECK-NEXT: da analyze - none!439; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4440; CHECK-NEXT: da analyze - flow [* -38]!441; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4442; CHECK-NEXT: da analyze - confused!443; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4444; CHECK-NEXT: da analyze - none!445; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4446; CHECK-NEXT: da analyze - confused!447; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4448; CHECK-NEXT: da analyze - none!449;450entry:451 br label %for.cond1.preheader452 453for.cond1.preheader: ; preds = %entry, %for.inc14454 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc14 ]455 %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ]456 br label %for.body3457 458for.body3: ; preds = %for.cond1.preheader, %for.body3459 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]460 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]461 %conv = trunc i64 %i.03 to i32462 %mul = mul nsw i64 %i.03, -5463 %add = add nsw i64 %mul, %j.02464 %add4 = add nsw i64 %add, 2465 %mul5 = shl nsw i64 %i.03, 1466 %add6 = add nsw i64 %mul5, 4467 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4468 store i32 %conv, ptr %arrayidx7, align 4469 %mul8 = mul nsw i64 %i.03, 5470 %add9 = add nsw i64 %mul8, %j.02471 %mul10 = mul nsw i64 %i.03, -2472 %add11 = add nsw i64 %mul10, 20473 %arrayidx13 = getelementptr inbounds [100 x i32], ptr %A, i64 %add11, i64 %add9474 %0 = load i32, ptr %arrayidx13, align 4475 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1476 store i32 %0, ptr %B.addr.11, align 4477 %inc = add nsw i64 %j.02, 1478 %exitcond = icmp ne i64 %inc, 100479 br i1 %exitcond, label %for.body3, label %for.inc14480 481for.inc14: ; preds = %for.body3482 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100483 %inc15 = add nsw i64 %i.03, 1484 %exitcond5 = icmp ne i64 %inc15, 100485 br i1 %exitcond5, label %for.cond1.preheader, label %for.end16486 487for.end16: ; preds = %for.inc14488 ret void489}490 491 492;; for (long int i = 0; i < 100; i++)493;; for (long int j = 0; j < 100; j++) {494;; A[4][j + 2] = i;495;; *B++ = A[-2*i + 4][5*i + j];496 497define void @prop8(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {498; CHECK-LABEL: 'prop8'499; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4500; CHECK-NEXT: da analyze - consistent output [S 0]!501; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4502; CHECK-NEXT: da analyze - flow [=> <]!503; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4504; CHECK-NEXT: da analyze - confused!505; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4506; CHECK-NEXT: da analyze - none!507; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4508; CHECK-NEXT: da analyze - confused!509; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4510; CHECK-NEXT: da analyze - none!511;512entry:513 br label %for.cond1.preheader514 515for.cond1.preheader: ; preds = %entry, %for.inc10516 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ]517 %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]518 br label %for.body3519 520for.body3: ; preds = %for.cond1.preheader, %for.body3521 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]522 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]523 %conv = trunc i64 %i.03 to i32524 %add = add nsw i64 %j.02, 2525 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %add526 store i32 %conv, ptr %arrayidx4, align 4527 %mul = mul nsw i64 %i.03, 5528 %add5 = add nsw i64 %mul, %j.02529 %mul6 = mul nsw i64 %i.03, -2530 %add7 = add nsw i64 %mul6, 4531 %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 %add7, i64 %add5532 %0 = load i32, ptr %arrayidx9, align 4533 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1534 store i32 %0, ptr %B.addr.11, align 4535 %inc = add nsw i64 %j.02, 1536 %exitcond = icmp ne i64 %inc, 100537 br i1 %exitcond, label %for.body3, label %for.inc10538 539for.inc10: ; preds = %for.body3540 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100541 %inc11 = add nsw i64 %i.03, 1542 %exitcond5 = icmp ne i64 %inc11, 100543 br i1 %exitcond5, label %for.cond1.preheader, label %for.end12544 545for.end12: ; preds = %for.inc10546 ret void547}548 549 550;; for (long int i = 0; i < 100; i++)551;; for (long int j = 0; j < 100; j++) {552;; A[2*i + 4][5*i + j + 2] = i;553;; *B++ = A[4][j];554 555define void @prop9(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {556; CHECK-LABEL: 'prop9'557; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4558; CHECK-NEXT: da analyze - none!559; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4560; CHECK-NEXT: da analyze - flow [<= <]!561; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4562; CHECK-NEXT: da analyze - confused!563; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4564; CHECK-NEXT: da analyze - consistent input [S 0]!565; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4566; CHECK-NEXT: da analyze - confused!567; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4568; CHECK-NEXT: da analyze - none!569;570entry:571 br label %for.cond1.preheader572 573for.cond1.preheader: ; preds = %entry, %for.inc10574 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ]575 %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]576 br label %for.body3577 578for.body3: ; preds = %for.cond1.preheader, %for.body3579 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]580 %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]581 %conv = trunc i64 %i.03 to i32582 %mul = mul nsw i64 %i.03, 5583 %add = add nsw i64 %mul, %j.02584 %add4 = add nsw i64 %add, 2585 %mul5 = shl nsw i64 %i.03, 1586 %add6 = add nsw i64 %mul5, 4587 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4588 store i32 %conv, ptr %arrayidx7, align 4589 %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %j.02590 %0 = load i32, ptr %arrayidx9, align 4591 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1592 store i32 %0, ptr %B.addr.11, align 4593 %inc = add nsw i64 %j.02, 1594 %exitcond = icmp ne i64 %inc, 100595 br i1 %exitcond, label %for.body3, label %for.inc10596 597for.inc10: ; preds = %for.body3598 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100599 %inc11 = add nsw i64 %i.03, 1600 %exitcond5 = icmp ne i64 %inc11, 100601 br i1 %exitcond5, label %for.cond1.preheader, label %for.end12602 603for.end12: ; preds = %for.inc10604 ret void605}606