1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ 3; RUN: | FileCheck %s 4 5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 6target triple = "x86_64-apple-macosx10.6.0" 7 8 9;; for (long 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 4 17; CHECK-NEXT: da analyze - none! 18; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4 19; 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 4 21; CHECK-NEXT: da analyze - confused! 22; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4 23; 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 4 25; 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 4 27; CHECK-NEXT: da analyze - none! 28; 29entry: 30 br label %for.cond1.preheader 31 32for.cond1.preheader: ; preds = %entry, %for.inc9 33 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ] 34 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] 35 br label %for.body3 36 37for.body3: ; preds = %for.cond1.preheader, %for.body3 38 %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 i32 41 %add = add nsw i64 %i.03, %j.02 42 %add4 = add nsw i64 %i.03, 1 43 %arrayidx5 = getelementptr inbounds [100 x i32], ptr %A, i64 %add4, i64 %add 44 store i32 %conv, ptr %arrayidx5, align 4 45 %add6 = add nsw i64 %i.03, %j.02 46 %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add6 47 %0 = load i32, ptr %arrayidx8, align 4 48 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 49 store i32 %0, ptr %B.addr.11, align 4 50 %inc = add nsw i64 %j.02, 1 51 %exitcond = icmp ne i64 %inc, 100 52 br i1 %exitcond, label %for.body3, label %for.inc9 53 54for.inc9: ; preds = %for.body3 55 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 56 %inc10 = add nsw i64 %i.03, 1 57 %exitcond5 = icmp ne i64 %inc10, 100 58 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11 59 60for.end11: ; preds = %for.inc9 61 ret void 62} 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 4 74; CHECK-NEXT: da analyze - output [* * *]! 75; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 4 76; 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 4 78; CHECK-NEXT: da analyze - confused! 79; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx14, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 4 80; 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 4 82; 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 4 84; CHECK-NEXT: da analyze - none! 85; 86entry: 87 br label %for.cond1.preheader 88 89for.cond1.preheader: ; preds = %entry, %for.inc18 90 %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.preheader 93 94for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc15 95 %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.body6 98 99for.body6: ; preds = %for.cond4.preheader, %for.body6 100 %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 i32 103 %add = add nsw i64 %j.03, %k.02 104 %add7 = add nsw i64 %i.05, 1 105 %sub = sub nsw i64 %j.03, %i.05 106 %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub, i64 %add7, i64 %add 107 store i32 %conv, ptr %arrayidx9, align 4 108 %add10 = add nsw i64 %j.03, %k.02 109 %sub11 = sub nsw i64 %j.03, %i.05 110 %arrayidx14 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub11, i64 %i.05, i64 %add10 111 %0 = load i32, ptr %arrayidx14, align 4 112 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.21, i64 1 113 store i32 %0, ptr %B.addr.21, align 4 114 %inc = add nsw i64 %k.02, 1 115 %exitcond = icmp ne i64 %inc, 100 116 br i1 %exitcond, label %for.body6, label %for.inc15 117 118for.inc15: ; preds = %for.body6 119 %scevgep = getelementptr i32, ptr %B.addr.14, i64 100 120 %inc16 = add nsw i64 %j.03, 1 121 %exitcond8 = icmp ne i64 %inc16, 100 122 br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18 123 124for.inc18: ; preds = %for.inc15 125 %scevgep7 = getelementptr i32, ptr %B.addr.06, i64 10000 126 %inc19 = add nsw i64 %i.05, 1 127 %exitcond9 = icmp ne i64 %inc19, 100 128 br i1 %exitcond9, label %for.cond1.preheader, label %for.end20 129 130for.end20: ; preds = %for.inc18 131 ret void 132} 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 4 144; 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 4 146; 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 4 148; CHECK-NEXT: da analyze - confused! 149; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4 150; 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 4 152; 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 4 154; CHECK-NEXT: da analyze - none! 155; 156entry: 157 br label %for.cond1.preheader 158 159for.cond1.preheader: ; preds = %entry, %for.inc8 160 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc8 ] 161 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] 162 br label %for.body3 163 164for.body3: ; preds = %for.cond1.preheader, %for.body3 165 %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 i32 168 %mul = shl nsw i64 %i.03, 1 169 %sub = add nsw i64 %i.03, -1 170 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %sub, i64 %mul 171 store i32 %conv, ptr %arrayidx4, align 4 172 %add = add nsw i64 %i.03, %j.02 173 %add5 = add nsw i64 %add, 110 174 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add5 175 %0 = load i32, ptr %arrayidx7, align 4 176 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 177 store i32 %0, ptr %B.addr.11, align 4 178 %inc = add nsw i64 %j.02, 1 179 %exitcond = icmp ne i64 %inc, 100 180 br i1 %exitcond, label %for.body3, label %for.inc8 181 182for.inc8: ; preds = %for.body3 183 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 184 %inc9 = add nsw i64 %i.03, 1 185 %exitcond5 = icmp ne i64 %inc9, 100 186 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10 187 188for.end10: ; preds = %for.inc8 189 ret void 190} 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 4 201; CHECK-NEXT: da analyze - output [* *]! 202; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4 203; 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 4 205; CHECK-NEXT: da analyze - confused! 206; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4 207; 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 4 209; 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 4 211; CHECK-NEXT: da analyze - none! 212; 213entry: 214 br label %for.cond1.preheader 215 216for.cond1.preheader: ; preds = %entry, %for.inc9 217 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ] 218 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] 219 br label %for.body3 220 221for.body3: ; preds = %for.cond1.preheader, %for.body3 222 %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 i32 225 %mul = shl nsw i64 %j.02, 1 226 %add = add nsw i64 %mul, %i.03 227 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add 228 store i32 %conv, ptr %arrayidx4, align 4 229 %mul5 = shl nsw i64 %j.02, 1 230 %sub = sub nsw i64 %mul5, %i.03 231 %add6 = add nsw i64 %sub, 5 232 %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add6 233 %0 = load i32, ptr %arrayidx8, align 4 234 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 235 store i32 %0, ptr %B.addr.11, align 4 236 %inc = add nsw i64 %j.02, 1 237 %exitcond = icmp ne i64 %inc, 100 238 br i1 %exitcond, label %for.body3, label %for.inc9 239 240for.inc9: ; preds = %for.body3 241 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 242 %inc10 = add nsw i64 %i.03, 1 243 %exitcond5 = icmp ne i64 %inc10, 100 244 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11 245 246for.end11: ; preds = %for.inc9 247 ret void 248} 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 4 259; CHECK-NEXT: da analyze - none! 260; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4 261; 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 4 263; CHECK-NEXT: da analyze - confused! 264; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx10, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4 265; 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 4 267; 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 4 269; CHECK-NEXT: da analyze - none! 270; 271entry: 272 br label %for.cond1.preheader 273 274for.cond1.preheader: ; preds = %entry, %for.inc11 275 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc11 ] 276 %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ] 277 br label %for.body3 278 279for.body3: ; preds = %for.cond1.preheader, %for.body3 280 %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 i32 283 %mul = shl nsw i64 %i.03, 1 284 %add = add nsw i64 %mul, %j.02 285 %add4 = add nsw i64 %add, 1 286 %add5 = add nsw i64 %i.03, 2 287 %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4 288 store i32 %conv, ptr %arrayidx6, align 4 289 %mul7 = shl nsw i64 %i.03, 1 290 %add8 = add nsw i64 %mul7, %j.02 291 %arrayidx10 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add8 292 %0 = load i32, ptr %arrayidx10, align 4 293 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 294 store i32 %0, ptr %B.addr.11, align 4 295 %inc = add nsw i64 %j.02, 1 296 %exitcond = icmp ne i64 %inc, 100 297 br i1 %exitcond, label %for.body3, label %for.inc11 298 299for.inc11: ; preds = %for.body3 300 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 301 %inc12 = add nsw i64 %i.03, 1 302 %exitcond5 = icmp ne i64 %inc12, 100 303 br i1 %exitcond5, label %for.cond1.preheader, label %for.end13 304 305for.end13: ; preds = %for.inc11 306 ret void 307} 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 4 318; CHECK-NEXT: da analyze - none! 319; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4 320; 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 4 322; CHECK-NEXT: da analyze - confused! 323; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx12, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4 324; 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 4 326; 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 4 328; CHECK-NEXT: da analyze - none! 329; 330entry: 331 br label %for.cond1.preheader 332 333for.cond1.preheader: ; preds = %entry, %for.inc13 334 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc13 ] 335 %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ] 336 br label %for.body3 337 338for.body3: ; preds = %for.cond1.preheader, %for.body3 339 %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 i32 342 %mul = shl nsw i64 %i.03, 1 343 %add = add nsw i64 %mul, %j.02 344 %sub = sub nsw i64 22, %i.03 345 %mul4 = mul nsw i64 %i.03, 3 346 %sub5 = add nsw i64 %mul4, -18 347 %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub5, i64 %sub, i64 %add 348 store i32 %conv, ptr %arrayidx7, align 4 349 %mul8 = mul nsw i64 %i.03, 3 350 %add9 = add nsw i64 %mul8, %j.02 351 %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %i.03, i64 %i.03, i64 %add9 352 %0 = load i32, ptr %arrayidx12, align 4 353 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 354 store i32 %0, ptr %B.addr.11, align 4 355 %inc = add nsw i64 %j.02, 1 356 %exitcond = icmp ne i64 %inc, 100 357 br i1 %exitcond, label %for.body3, label %for.inc13 358 359for.inc13: ; preds = %for.body3 360 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 361 %inc14 = add nsw i64 %i.03, 1 362 %exitcond5 = icmp ne i64 %inc14, 100 363 br i1 %exitcond5, label %for.cond1.preheader, label %for.end15 364 365for.end15: ; preds = %for.inc13 366 ret void 367} 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 4 378; CHECK-NEXT: da analyze - none! 379; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4 380; 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 4 382; CHECK-NEXT: da analyze - confused! 383; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx11, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4 384; 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 4 386; 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 4 388; CHECK-NEXT: da analyze - none! 389; 390entry: 391 br label %for.cond1.preheader 392 393for.cond1.preheader: ; preds = %entry, %for.inc12 394 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc12 ] 395 %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ] 396 br label %for.body3 397 398for.body3: ; preds = %for.cond1.preheader, %for.body3 399 %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 i32 402 %mul = shl nsw i64 %i.03, 2 403 %add = add nsw i64 %mul, %j.02 404 %add4 = add nsw i64 %add, 2 405 %add5 = add nsw i64 %i.03, 1 406 %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4 407 store i32 %conv, ptr %arrayidx6, align 4 408 %mul7 = shl nsw i64 %i.03, 3 409 %add8 = add nsw i64 %mul7, %j.02 410 %mul9 = shl nsw i64 %i.03, 1 411 %arrayidx11 = getelementptr inbounds [100 x i32], ptr %A, i64 %mul9, i64 %add8 412 %0 = load i32, ptr %arrayidx11, align 4 413 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 414 store i32 %0, ptr %B.addr.11, align 4 415 %inc = add nsw i64 %j.02, 1 416 %exitcond = icmp ne i64 %inc, 100 417 br i1 %exitcond, label %for.body3, label %for.inc12 418 419for.inc12: ; preds = %for.body3 420 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 421 %inc13 = add nsw i64 %i.03, 1 422 %exitcond5 = icmp ne i64 %inc13, 100 423 br i1 %exitcond5, label %for.cond1.preheader, label %for.end14 424 425for.end14: ; preds = %for.inc12 426 ret void 427} 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 4 438; CHECK-NEXT: da analyze - none! 439; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4 440; CHECK-NEXT: da analyze - flow [* <>]! 441; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4 442; CHECK-NEXT: da analyze - confused! 443; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4 444; 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 4 446; 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 4 448; CHECK-NEXT: da analyze - none! 449; 450entry: 451 br label %for.cond1.preheader 452 453for.cond1.preheader: ; preds = %entry, %for.inc14 454 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc14 ] 455 %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ] 456 br label %for.body3 457 458for.body3: ; preds = %for.cond1.preheader, %for.body3 459 %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 i32 462 %mul = mul nsw i64 %i.03, -5 463 %add = add nsw i64 %mul, %j.02 464 %add4 = add nsw i64 %add, 2 465 %mul5 = shl nsw i64 %i.03, 1 466 %add6 = add nsw i64 %mul5, 4 467 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4 468 store i32 %conv, ptr %arrayidx7, align 4 469 %mul8 = mul nsw i64 %i.03, 5 470 %add9 = add nsw i64 %mul8, %j.02 471 %mul10 = mul nsw i64 %i.03, -2 472 %add11 = add nsw i64 %mul10, 20 473 %arrayidx13 = getelementptr inbounds [100 x i32], ptr %A, i64 %add11, i64 %add9 474 %0 = load i32, ptr %arrayidx13, align 4 475 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 476 store i32 %0, ptr %B.addr.11, align 4 477 %inc = add nsw i64 %j.02, 1 478 %exitcond = icmp ne i64 %inc, 100 479 br i1 %exitcond, label %for.body3, label %for.inc14 480 481for.inc14: ; preds = %for.body3 482 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 483 %inc15 = add nsw i64 %i.03, 1 484 %exitcond5 = icmp ne i64 %inc15, 100 485 br i1 %exitcond5, label %for.cond1.preheader, label %for.end16 486 487for.end16: ; preds = %for.inc14 488 ret void 489} 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 4 500; 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 4 502; 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 4 504; CHECK-NEXT: da analyze - confused! 505; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4 506; 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 4 508; 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 4 510; CHECK-NEXT: da analyze - none! 511; 512entry: 513 br label %for.cond1.preheader 514 515for.cond1.preheader: ; preds = %entry, %for.inc10 516 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ] 517 %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ] 518 br label %for.body3 519 520for.body3: ; preds = %for.cond1.preheader, %for.body3 521 %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 i32 524 %add = add nsw i64 %j.02, 2 525 %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %add 526 store i32 %conv, ptr %arrayidx4, align 4 527 %mul = mul nsw i64 %i.03, 5 528 %add5 = add nsw i64 %mul, %j.02 529 %mul6 = mul nsw i64 %i.03, -2 530 %add7 = add nsw i64 %mul6, 4 531 %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 %add7, i64 %add5 532 %0 = load i32, ptr %arrayidx9, align 4 533 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 534 store i32 %0, ptr %B.addr.11, align 4 535 %inc = add nsw i64 %j.02, 1 536 %exitcond = icmp ne i64 %inc, 100 537 br i1 %exitcond, label %for.body3, label %for.inc10 538 539for.inc10: ; preds = %for.body3 540 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 541 %inc11 = add nsw i64 %i.03, 1 542 %exitcond5 = icmp ne i64 %inc11, 100 543 br i1 %exitcond5, label %for.cond1.preheader, label %for.end12 544 545for.end12: ; preds = %for.inc10 546 ret void 547} 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 4 558; CHECK-NEXT: da analyze - none! 559; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4 560; 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 4 562; CHECK-NEXT: da analyze - confused! 563; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4 564; 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 4 566; 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 4 568; CHECK-NEXT: da analyze - none! 569; 570entry: 571 br label %for.cond1.preheader 572 573for.cond1.preheader: ; preds = %entry, %for.inc10 574 %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ] 575 %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ] 576 br label %for.body3 577 578for.body3: ; preds = %for.cond1.preheader, %for.body3 579 %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 i32 582 %mul = mul nsw i64 %i.03, 5 583 %add = add nsw i64 %mul, %j.02 584 %add4 = add nsw i64 %add, 2 585 %mul5 = shl nsw i64 %i.03, 1 586 %add6 = add nsw i64 %mul5, 4 587 %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4 588 store i32 %conv, ptr %arrayidx7, align 4 589 %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %j.02 590 %0 = load i32, ptr %arrayidx9, align 4 591 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1 592 store i32 %0, ptr %B.addr.11, align 4 593 %inc = add nsw i64 %j.02, 1 594 %exitcond = icmp ne i64 %inc, 100 595 br i1 %exitcond, label %for.body3, label %for.inc10 596 597for.inc10: ; preds = %for.body3 598 %scevgep = getelementptr i32, ptr %B.addr.04, i64 100 599 %inc11 = add nsw i64 %i.03, 1 600 %exitcond5 = icmp ne i64 %inc11, 100 601 br i1 %exitcond5, label %for.cond1.preheader, label %for.end12 602 603for.end12: ; preds = %for.inc10 604 ret void 605} 606