1; RUN: opt < %s -analyze -basicaa -da | FileCheck %s 2 3target 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" 4target triple = "x86_64-apple-macosx10.6.0" 5 6 7;;int p0(int n, int *A, int *B) { 8;; A[0] = n; 9;; return B[1]; 10 11define i32 @p0(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp { 12entry: 13 store i32 %n, i32* %A, align 4 14 15; CHECK-LABEL: p0 16; CHECK: da analyze - none! 17; CHECK: da analyze - confused! 18; CHECK: da analyze - none! 19 20 %arrayidx1 = getelementptr inbounds i32, i32* %B, i64 1 21 %0 = load i32, i32* %arrayidx1, align 4 22 ret i32 %0 23} 24 25 26;;int p1(int n, int *restrict A, int *restrict B) { 27;; A[0] = n; 28;; return B[1]; 29 30define i32 @p1(i32 %n, i32* noalias %A, i32* noalias %B) nounwind uwtable ssp { 31entry: 32 store i32 %n, i32* %A, align 4 33 34; CHECK-LABEL: p1 35; CHECK: da analyze - none! 36; CHECK: da analyze - none! 37; CHECK: da analyze - none! 38 39 %arrayidx1 = getelementptr inbounds i32, i32* %B, i64 1 40 %0 = load i32, i32* %arrayidx1, align 4 41 ret i32 %0 42} 43 44 45;; for (long int i = 0; i < n; i++) { 46;; for (long int j = 0; j < n; j++) { 47;; for (long int k = 0; k < n; k++) { 48;; A[i][j][k] = i; 49;; } 50;; for (long int k = 0; k < n; k++) { 51;; *B++ = A[i + 3][j + 2][k + 1]; 52 53define void @p2(i64 %n, [100 x [100 x i64]]* %A, i64* %B) nounwind uwtable ssp { 54entry: 55 %cmp10 = icmp sgt i64 %n, 0 56 br i1 %cmp10, label %for.cond1.preheader.preheader, label %for.end26 57 58; CHECK-LABEL: p2 59; CHECK: da analyze - output [* * *]! 60; CHECK: da analyze - flow [* *|<]! 61; CHECK: da analyze - confused! 62; CHECK: da analyze - input [* * *]! 63; CHECK: da analyze - confused! 64; CHECK: da analyze - output [* * *]! 65 66for.cond1.preheader.preheader: ; preds = %entry 67 br label %for.cond1.preheader 68 69for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc24 70 %B.addr.012 = phi i64* [ %B.addr.1.lcssa, %for.inc24 ], [ %B, %for.cond1.preheader.preheader ] 71 %i.011 = phi i64 [ %inc25, %for.inc24 ], [ 0, %for.cond1.preheader.preheader ] 72 %cmp26 = icmp sgt i64 %n, 0 73 br i1 %cmp26, label %for.cond4.preheader.preheader, label %for.inc24 74 75for.cond4.preheader.preheader: ; preds = %for.cond1.preheader 76 br label %for.cond4.preheader 77 78for.cond4.preheader: ; preds = %for.cond4.preheader.preheader, %for.inc21 79 %B.addr.18 = phi i64* [ %B.addr.2.lcssa, %for.inc21 ], [ %B.addr.012, %for.cond4.preheader.preheader ] 80 %j.07 = phi i64 [ %inc22, %for.inc21 ], [ 0, %for.cond4.preheader.preheader ] 81 %cmp51 = icmp sgt i64 %n, 0 82 br i1 %cmp51, label %for.body6.preheader, label %for.cond10.loopexit 83 84for.body6.preheader: ; preds = %for.cond4.preheader 85 br label %for.body6 86 87for.body6: ; preds = %for.body6.preheader, %for.body6 88 %k.02 = phi i64 [ %inc, %for.body6 ], [ 0, %for.body6.preheader ] 89 %arrayidx8 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* %A, i64 %i.011, i64 %j.07, i64 %k.02 90 store i64 %i.011, i64* %arrayidx8, align 8 91 %inc = add nsw i64 %k.02, 1 92 %exitcond13 = icmp ne i64 %inc, %n 93 br i1 %exitcond13, label %for.body6, label %for.cond10.loopexit.loopexit 94 95for.cond10.loopexit.loopexit: ; preds = %for.body6 96 br label %for.cond10.loopexit 97 98for.cond10.loopexit: ; preds = %for.cond10.loopexit.loopexit, %for.cond4.preheader 99 %cmp113 = icmp sgt i64 %n, 0 100 br i1 %cmp113, label %for.body12.preheader, label %for.inc21 101 102for.body12.preheader: ; preds = %for.cond10.loopexit 103 br label %for.body12 104 105for.body12: ; preds = %for.body12.preheader, %for.body12 106 %k9.05 = phi i64 [ %inc19, %for.body12 ], [ 0, %for.body12.preheader ] 107 %B.addr.24 = phi i64* [ %incdec.ptr, %for.body12 ], [ %B.addr.18, %for.body12.preheader ] 108 %add = add nsw i64 %k9.05, 1 109 %add13 = add nsw i64 %j.07, 2 110 %add14 = add nsw i64 %i.011, 3 111 %arrayidx17 = getelementptr inbounds [100 x [100 x i64]], [100 x [100 x i64]]* %A, i64 %add14, i64 %add13, i64 %add 112 %0 = load i64, i64* %arrayidx17, align 8 113 %incdec.ptr = getelementptr inbounds i64, i64* %B.addr.24, i64 1 114 store i64 %0, i64* %B.addr.24, align 8 115 %inc19 = add nsw i64 %k9.05, 1 116 %exitcond = icmp ne i64 %inc19, %n 117 br i1 %exitcond, label %for.body12, label %for.inc21.loopexit 118 119for.inc21.loopexit: ; preds = %for.body12 120 %scevgep = getelementptr i64, i64* %B.addr.18, i64 %n 121 br label %for.inc21 122 123for.inc21: ; preds = %for.inc21.loopexit, %for.cond10.loopexit 124 %B.addr.2.lcssa = phi i64* [ %B.addr.18, %for.cond10.loopexit ], [ %scevgep, %for.inc21.loopexit ] 125 %inc22 = add nsw i64 %j.07, 1 126 %exitcond14 = icmp ne i64 %inc22, %n 127 br i1 %exitcond14, label %for.cond4.preheader, label %for.inc24.loopexit 128 129for.inc24.loopexit: ; preds = %for.inc21 130 %B.addr.2.lcssa.lcssa = phi i64* [ %B.addr.2.lcssa, %for.inc21 ] 131 br label %for.inc24 132 133for.inc24: ; preds = %for.inc24.loopexit, %for.cond1.preheader 134 %B.addr.1.lcssa = phi i64* [ %B.addr.012, %for.cond1.preheader ], [ %B.addr.2.lcssa.lcssa, %for.inc24.loopexit ] 135 %inc25 = add nsw i64 %i.011, 1 136 %exitcond15 = icmp ne i64 %inc25, %n 137 br i1 %exitcond15, label %for.cond1.preheader, label %for.end26.loopexit 138 139for.end26.loopexit: ; preds = %for.inc24 140 br label %for.end26 141 142for.end26: ; preds = %for.end26.loopexit, %entry 143 ret void 144} 145 146 147; This ridiculous example is disabled: it does not make sense to keep it. 148;; for (long int i = 0; i < n; i++) 149;; for (long int j = 0; j < n; j++) 150;; for (long int k = 0; k < n; k++) 151;; for (long int l = 0; l < n; l++) 152;; for (long int m = 0; m < n; m++) 153;; for (long int o = 0; o < n; o++) 154;; for (long int p = 0; p < n; p++) 155;; for (long int q = 0; q < n; q++) 156;; for (long int r = 0; r < n; r++) 157;; for (long int s = 0; s < n; s++) 158;; for (long int u = 0; u < n; u++) 159;; for (long int t = 0; t < n; t++) { 160;; A[i - 3] [j] [2] [k-1] [2*l + 1] [m] [p + q] [r + s] = i; 161;; *B++ = A[i + 3] [2] [u] [1-k] [3*l - 1] [o] [1 + n] [t + 2]; 162 163;define void @p3(i64 %n, [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]]* %A, i64* %B) nounwind uwtable ssp { 164;entry: 165; %cmp44 = icmp sgt i64 %n, 0 166; br i1 %cmp44, label %for.cond1.preheader.preheader, label %for.end90 167; 168;; DONT-CHECK-LABEL: p3 169;; DONT-CHECK: da analyze - output [* * * * * S * * * * S S]! 170;; DONT-CHECK: da analyze - flow [* * * * * * * * * * * *|<]! 171;; DONT-CHECK: da analyze - confused! 172;; DONT-CHECK: da analyze - input [* S * * S * S S S S * *]! 173;; DONT-CHECK: da analyze - confused! 174;; DONT-CHECK: da analyze - output [* * * * * * * * * * * *]! 175; 176;for.cond1.preheader.preheader: ; preds = %entry 177; br label %for.cond1.preheader 178; 179;for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc88 180; %B.addr.046 = phi i64* [ %B.addr.1.lcssa, %for.inc88 ], [ %B, %for.cond1.preheader.preheader ] 181; %i.045 = phi i64 [ %inc89, %for.inc88 ], [ 0, %for.cond1.preheader.preheader ] 182; %cmp240 = icmp sgt i64 %n, 0 183; br i1 %cmp240, label %for.cond4.preheader.preheader, label %for.inc88 184; 185;for.cond4.preheader.preheader: ; preds = %for.cond1.preheader 186; br label %for.cond4.preheader 187; 188;for.cond4.preheader: ; preds = %for.cond4.preheader.preheader, %for.inc85 189; %B.addr.142 = phi i64* [ %B.addr.2.lcssa, %for.inc85 ], [ %B.addr.046, %for.cond4.preheader.preheader ] 190; %j.041 = phi i64 [ %inc86, %for.inc85 ], [ 0, %for.cond4.preheader.preheader ] 191; %cmp536 = icmp sgt i64 %n, 0 192; br i1 %cmp536, label %for.cond7.preheader.preheader, label %for.inc85 193; 194;for.cond7.preheader.preheader: ; preds = %for.cond4.preheader 195; br label %for.cond7.preheader 196; 197;for.cond7.preheader: ; preds = %for.cond7.preheader.preheader, %for.inc82 198; %B.addr.238 = phi i64* [ %B.addr.3.lcssa, %for.inc82 ], [ %B.addr.142, %for.cond7.preheader.preheader ] 199; %k.037 = phi i64 [ %inc83, %for.inc82 ], [ 0, %for.cond7.preheader.preheader ] 200; %cmp832 = icmp sgt i64 %n, 0 201; br i1 %cmp832, label %for.cond10.preheader.preheader, label %for.inc82 202; 203;for.cond10.preheader.preheader: ; preds = %for.cond7.preheader 204; br label %for.cond10.preheader 205; 206;for.cond10.preheader: ; preds = %for.cond10.preheader.preheader, %for.inc79 207; %B.addr.334 = phi i64* [ %B.addr.4.lcssa, %for.inc79 ], [ %B.addr.238, %for.cond10.preheader.preheader ] 208; %l.033 = phi i64 [ %inc80, %for.inc79 ], [ 0, %for.cond10.preheader.preheader ] 209; %cmp1128 = icmp sgt i64 %n, 0 210; br i1 %cmp1128, label %for.cond13.preheader.preheader, label %for.inc79 211; 212;for.cond13.preheader.preheader: ; preds = %for.cond10.preheader 213; br label %for.cond13.preheader 214; 215;for.cond13.preheader: ; preds = %for.cond13.preheader.preheader, %for.inc76 216; %B.addr.430 = phi i64* [ %B.addr.5.lcssa, %for.inc76 ], [ %B.addr.334, %for.cond13.preheader.preheader ] 217; %m.029 = phi i64 [ %inc77, %for.inc76 ], [ 0, %for.cond13.preheader.preheader ] 218; %cmp1424 = icmp sgt i64 %n, 0 219; br i1 %cmp1424, label %for.cond16.preheader.preheader, label %for.inc76 220; 221;for.cond16.preheader.preheader: ; preds = %for.cond13.preheader 222; br label %for.cond16.preheader 223; 224;for.cond16.preheader: ; preds = %for.cond16.preheader.preheader, %for.inc73 225; %B.addr.526 = phi i64* [ %B.addr.6.lcssa, %for.inc73 ], [ %B.addr.430, %for.cond16.preheader.preheader ] 226; %o.025 = phi i64 [ %inc74, %for.inc73 ], [ 0, %for.cond16.preheader.preheader ] 227; %cmp1720 = icmp sgt i64 %n, 0 228; br i1 %cmp1720, label %for.cond19.preheader.preheader, label %for.inc73 229; 230;for.cond19.preheader.preheader: ; preds = %for.cond16.preheader 231; br label %for.cond19.preheader 232; 233;for.cond19.preheader: ; preds = %for.cond19.preheader.preheader, %for.inc70 234; %B.addr.622 = phi i64* [ %B.addr.7.lcssa, %for.inc70 ], [ %B.addr.526, %for.cond19.preheader.preheader ] 235; %p.021 = phi i64 [ %inc71, %for.inc70 ], [ 0, %for.cond19.preheader.preheader ] 236; %cmp2016 = icmp sgt i64 %n, 0 237; br i1 %cmp2016, label %for.cond22.preheader.preheader, label %for.inc70 238; 239;for.cond22.preheader.preheader: ; preds = %for.cond19.preheader 240; br label %for.cond22.preheader 241; 242;for.cond22.preheader: ; preds = %for.cond22.preheader.preheader, %for.inc67 243; %B.addr.718 = phi i64* [ %B.addr.8.lcssa, %for.inc67 ], [ %B.addr.622, %for.cond22.preheader.preheader ] 244; %q.017 = phi i64 [ %inc68, %for.inc67 ], [ 0, %for.cond22.preheader.preheader ] 245; %cmp2312 = icmp sgt i64 %n, 0 246; br i1 %cmp2312, label %for.cond25.preheader.preheader, label %for.inc67 247; 248;for.cond25.preheader.preheader: ; preds = %for.cond22.preheader 249; br label %for.cond25.preheader 250; 251;for.cond25.preheader: ; preds = %for.cond25.preheader.preheader, %for.inc64 252; %B.addr.814 = phi i64* [ %B.addr.9.lcssa, %for.inc64 ], [ %B.addr.718, %for.cond25.preheader.preheader ] 253; %r.013 = phi i64 [ %inc65, %for.inc64 ], [ 0, %for.cond25.preheader.preheader ] 254; %cmp268 = icmp sgt i64 %n, 0 255; br i1 %cmp268, label %for.cond28.preheader.preheader, label %for.inc64 256; 257;for.cond28.preheader.preheader: ; preds = %for.cond25.preheader 258; br label %for.cond28.preheader 259; 260;for.cond28.preheader: ; preds = %for.cond28.preheader.preheader, %for.inc61 261; %B.addr.910 = phi i64* [ %B.addr.10.lcssa, %for.inc61 ], [ %B.addr.814, %for.cond28.preheader.preheader ] 262; %s.09 = phi i64 [ %inc62, %for.inc61 ], [ 0, %for.cond28.preheader.preheader ] 263; %cmp294 = icmp sgt i64 %n, 0 264; br i1 %cmp294, label %for.cond31.preheader.preheader, label %for.inc61 265; 266;for.cond31.preheader.preheader: ; preds = %for.cond28.preheader 267; br label %for.cond31.preheader 268; 269;for.cond31.preheader: ; preds = %for.cond31.preheader.preheader, %for.inc58 270; %u.06 = phi i64 [ %inc59, %for.inc58 ], [ 0, %for.cond31.preheader.preheader ] 271; %B.addr.105 = phi i64* [ %B.addr.11.lcssa, %for.inc58 ], [ %B.addr.910, %for.cond31.preheader.preheader ] 272; %cmp321 = icmp sgt i64 %n, 0 273; br i1 %cmp321, label %for.body33.preheader, label %for.inc58 274; 275;for.body33.preheader: ; preds = %for.cond31.preheader 276; br label %for.body33 277; 278;for.body33: ; preds = %for.body33.preheader, %for.body33 279; %t.03 = phi i64 [ %inc, %for.body33 ], [ 0, %for.body33.preheader ] 280; %B.addr.112 = phi i64* [ %incdec.ptr, %for.body33 ], [ %B.addr.105, %for.body33.preheader ] 281; %add = add nsw i64 %r.013, %s.09 282; %add34 = add nsw i64 %p.021, %q.017 283; %mul = shl nsw i64 %l.033, 1 284; %add3547 = or i64 %mul, 1 285; %sub = add nsw i64 %k.037, -1 286; %sub36 = add nsw i64 %i.045, -3 287; %arrayidx43 = getelementptr inbounds [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]], [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]]* %A, i64 %sub36, i64 %j.041, i64 2, i64 %sub, i64 %add3547, i64 %m.029, i64 %add34, i64 %add 288; store i64 %i.045, i64* %arrayidx43, align 8 289; %add44 = add nsw i64 %t.03, 2 290; %add45 = add nsw i64 %n, 1 291; %mul46 = mul nsw i64 %l.033, 3 292; %sub47 = add nsw i64 %mul46, -1 293; %sub48 = sub nsw i64 1, %k.037 294; %add49 = add nsw i64 %i.045, 3 295; %arrayidx57 = getelementptr inbounds [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]], [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]]* %A, i64 %add49, i64 2, i64 %u.06, i64 %sub48, i64 %sub47, i64 %o.025, i64 %add45, i64 %add44 296; %0 = load i64, i64* %arrayidx57, align 8 297; %incdec.ptr = getelementptr inbounds i64, i64* %B.addr.112, i64 1 298; store i64 %0, i64* %B.addr.112, align 8 299; %inc = add nsw i64 %t.03, 1 300; %exitcond = icmp ne i64 %inc, %n 301; br i1 %exitcond, label %for.body33, label %for.inc58.loopexit 302; 303;for.inc58.loopexit: ; preds = %for.body33 304; %scevgep = getelementptr i64, i64* %B.addr.105, i64 %n 305; br label %for.inc58 306; 307;for.inc58: ; preds = %for.inc58.loopexit, %for.cond31.preheader 308; %B.addr.11.lcssa = phi i64* [ %B.addr.105, %for.cond31.preheader ], [ %scevgep, %for.inc58.loopexit ] 309; %inc59 = add nsw i64 %u.06, 1 310; %exitcond48 = icmp ne i64 %inc59, %n 311; br i1 %exitcond48, label %for.cond31.preheader, label %for.inc61.loopexit 312; 313;for.inc61.loopexit: ; preds = %for.inc58 314; %B.addr.11.lcssa.lcssa = phi i64* [ %B.addr.11.lcssa, %for.inc58 ] 315; br label %for.inc61 316; 317;for.inc61: ; preds = %for.inc61.loopexit, %for.cond28.preheader 318; %B.addr.10.lcssa = phi i64* [ %B.addr.910, %for.cond28.preheader ], [ %B.addr.11.lcssa.lcssa, %for.inc61.loopexit ] 319; %inc62 = add nsw i64 %s.09, 1 320; %exitcond49 = icmp ne i64 %inc62, %n 321; br i1 %exitcond49, label %for.cond28.preheader, label %for.inc64.loopexit 322; 323;for.inc64.loopexit: ; preds = %for.inc61 324; %B.addr.10.lcssa.lcssa = phi i64* [ %B.addr.10.lcssa, %for.inc61 ] 325; br label %for.inc64 326; 327;for.inc64: ; preds = %for.inc64.loopexit, %for.cond25.preheader 328; %B.addr.9.lcssa = phi i64* [ %B.addr.814, %for.cond25.preheader ], [ %B.addr.10.lcssa.lcssa, %for.inc64.loopexit ] 329; %inc65 = add nsw i64 %r.013, 1 330; %exitcond50 = icmp ne i64 %inc65, %n 331; br i1 %exitcond50, label %for.cond25.preheader, label %for.inc67.loopexit 332; 333;for.inc67.loopexit: ; preds = %for.inc64 334; %B.addr.9.lcssa.lcssa = phi i64* [ %B.addr.9.lcssa, %for.inc64 ] 335; br label %for.inc67 336; 337;for.inc67: ; preds = %for.inc67.loopexit, %for.cond22.preheader 338; %B.addr.8.lcssa = phi i64* [ %B.addr.718, %for.cond22.preheader ], [ %B.addr.9.lcssa.lcssa, %for.inc67.loopexit ] 339; %inc68 = add nsw i64 %q.017, 1 340; %exitcond51 = icmp ne i64 %inc68, %n 341; br i1 %exitcond51, label %for.cond22.preheader, label %for.inc70.loopexit 342; 343;for.inc70.loopexit: ; preds = %for.inc67 344; %B.addr.8.lcssa.lcssa = phi i64* [ %B.addr.8.lcssa, %for.inc67 ] 345; br label %for.inc70 346; 347;for.inc70: ; preds = %for.inc70.loopexit, %for.cond19.preheader 348; %B.addr.7.lcssa = phi i64* [ %B.addr.622, %for.cond19.preheader ], [ %B.addr.8.lcssa.lcssa, %for.inc70.loopexit ] 349; %inc71 = add nsw i64 %p.021, 1 350; %exitcond52 = icmp ne i64 %inc71, %n 351; br i1 %exitcond52, label %for.cond19.preheader, label %for.inc73.loopexit 352; 353;for.inc73.loopexit: ; preds = %for.inc70 354; %B.addr.7.lcssa.lcssa = phi i64* [ %B.addr.7.lcssa, %for.inc70 ] 355; br label %for.inc73 356; 357;for.inc73: ; preds = %for.inc73.loopexit, %for.cond16.preheader 358; %B.addr.6.lcssa = phi i64* [ %B.addr.526, %for.cond16.preheader ], [ %B.addr.7.lcssa.lcssa, %for.inc73.loopexit ] 359; %inc74 = add nsw i64 %o.025, 1 360; %exitcond53 = icmp ne i64 %inc74, %n 361; br i1 %exitcond53, label %for.cond16.preheader, label %for.inc76.loopexit 362; 363;for.inc76.loopexit: ; preds = %for.inc73 364; %B.addr.6.lcssa.lcssa = phi i64* [ %B.addr.6.lcssa, %for.inc73 ] 365; br label %for.inc76 366; 367;for.inc76: ; preds = %for.inc76.loopexit, %for.cond13.preheader 368; %B.addr.5.lcssa = phi i64* [ %B.addr.430, %for.cond13.preheader ], [ %B.addr.6.lcssa.lcssa, %for.inc76.loopexit ] 369; %inc77 = add nsw i64 %m.029, 1 370; %exitcond54 = icmp ne i64 %inc77, %n 371; br i1 %exitcond54, label %for.cond13.preheader, label %for.inc79.loopexit 372; 373;for.inc79.loopexit: ; preds = %for.inc76 374; %B.addr.5.lcssa.lcssa = phi i64* [ %B.addr.5.lcssa, %for.inc76 ] 375; br label %for.inc79 376; 377;for.inc79: ; preds = %for.inc79.loopexit, %for.cond10.preheader 378; %B.addr.4.lcssa = phi i64* [ %B.addr.334, %for.cond10.preheader ], [ %B.addr.5.lcssa.lcssa, %for.inc79.loopexit ] 379; %inc80 = add nsw i64 %l.033, 1 380; %exitcond55 = icmp ne i64 %inc80, %n 381; br i1 %exitcond55, label %for.cond10.preheader, label %for.inc82.loopexit 382; 383;for.inc82.loopexit: ; preds = %for.inc79 384; %B.addr.4.lcssa.lcssa = phi i64* [ %B.addr.4.lcssa, %for.inc79 ] 385; br label %for.inc82 386; 387;for.inc82: ; preds = %for.inc82.loopexit, %for.cond7.preheader 388; %B.addr.3.lcssa = phi i64* [ %B.addr.238, %for.cond7.preheader ], [ %B.addr.4.lcssa.lcssa, %for.inc82.loopexit ] 389; %inc83 = add nsw i64 %k.037, 1 390; %exitcond56 = icmp ne i64 %inc83, %n 391; br i1 %exitcond56, label %for.cond7.preheader, label %for.inc85.loopexit 392; 393;for.inc85.loopexit: ; preds = %for.inc82 394; %B.addr.3.lcssa.lcssa = phi i64* [ %B.addr.3.lcssa, %for.inc82 ] 395; br label %for.inc85 396; 397;for.inc85: ; preds = %for.inc85.loopexit, %for.cond4.preheader 398; %B.addr.2.lcssa = phi i64* [ %B.addr.142, %for.cond4.preheader ], [ %B.addr.3.lcssa.lcssa, %for.inc85.loopexit ] 399; %inc86 = add nsw i64 %j.041, 1 400; %exitcond57 = icmp ne i64 %inc86, %n 401; br i1 %exitcond57, label %for.cond4.preheader, label %for.inc88.loopexit 402; 403;for.inc88.loopexit: ; preds = %for.inc85 404; %B.addr.2.lcssa.lcssa = phi i64* [ %B.addr.2.lcssa, %for.inc85 ] 405; br label %for.inc88 406; 407;for.inc88: ; preds = %for.inc88.loopexit, %for.cond1.preheader 408; %B.addr.1.lcssa = phi i64* [ %B.addr.046, %for.cond1.preheader ], [ %B.addr.2.lcssa.lcssa, %for.inc88.loopexit ] 409; %inc89 = add nsw i64 %i.045, 1 410; %exitcond58 = icmp ne i64 %inc89, %n 411; br i1 %exitcond58, label %for.cond1.preheader, label %for.end90.loopexit 412; 413;for.end90.loopexit: ; preds = %for.inc88 414; br label %for.end90 415; 416;for.end90: ; preds = %for.end90.loopexit, %entry 417; ret void 418;} 419 420 421;;void p4(int *A, int *B, long int n) { 422;; for (char i = 0; i < n; i++) { 423;; A[i + 2] = i; 424;; *B++ = A[i]; 425 426define void @p4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 427entry: 428 %cmp1 = icmp sgt i64 %n, 0 429 br i1 %cmp1, label %for.body.preheader, label %for.end 430 431; CHECK-LABEL: p4 432; CHECK: da analyze - output [*]! 433; CHECK: da analyze - flow [*|<]! 434; CHECK: da analyze - confused! 435; CHECK: da analyze - input [*]! 436; CHECK: da analyze - confused! 437; CHECK: da analyze - none! 438 439for.body.preheader: ; preds = %entry 440 br label %for.body 441 442for.body: ; preds = %for.body.preheader, %for.body 443 %i.03 = phi i8 [ %inc, %for.body ], [ 0, %for.body.preheader ] 444 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 445 %conv2 = sext i8 %i.03 to i32 446 %conv3 = sext i8 %i.03 to i64 447 %add = add i64 %conv3, 2 448 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 449 store i32 %conv2, i32* %arrayidx, align 4 450 %idxprom4 = sext i8 %i.03 to i64 451 %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %idxprom4 452 %0 = load i32, i32* %arrayidx5, align 4 453 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 454 store i32 %0, i32* %B.addr.02, align 4 455 %inc = add i8 %i.03, 1 456 %conv = sext i8 %inc to i64 457 %cmp = icmp slt i64 %conv, %n 458 br i1 %cmp, label %for.body, label %for.end.loopexit 459 460for.end.loopexit: ; preds = %for.body 461 br label %for.end 462 463for.end: ; preds = %for.end.loopexit, %entry 464 ret void 465} 466 467 468;;void p5(int *A, int *B, long int n) { 469;; for (short i = 0; i < n; i++) { 470;; A[i + 2] = i; 471;; *B++ = A[i]; 472 473define void @p5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 474entry: 475 %cmp1 = icmp sgt i64 %n, 0 476 br i1 %cmp1, label %for.body.preheader, label %for.end 477 478; CHECK-LABEL: p5 479; CHECK: da analyze - output [*]! 480; CHECK: da analyze - flow [*|<]! 481; CHECK: da analyze - confused! 482; CHECK: da analyze - input [*]! 483; CHECK: da analyze - confused! 484; CHECK: da analyze - none! 485 486for.body.preheader: ; preds = %entry 487 br label %for.body 488 489for.body: ; preds = %for.body.preheader, %for.body 490 %i.03 = phi i16 [ %inc, %for.body ], [ 0, %for.body.preheader ] 491 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 492 %conv2 = sext i16 %i.03 to i32 493 %conv3 = sext i16 %i.03 to i64 494 %add = add i64 %conv3, 2 495 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 496 store i32 %conv2, i32* %arrayidx, align 4 497 %idxprom4 = sext i16 %i.03 to i64 498 %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %idxprom4 499 %0 = load i32, i32* %arrayidx5, align 4 500 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 501 store i32 %0, i32* %B.addr.02, align 4 502 %inc = add i16 %i.03, 1 503 %conv = sext i16 %inc to i64 504 %cmp = icmp slt i64 %conv, %n 505 br i1 %cmp, label %for.body, label %for.end.loopexit 506 507for.end.loopexit: ; preds = %for.body 508 br label %for.end 509 510for.end: ; preds = %for.end.loopexit, %entry 511 ret void 512} 513 514 515;;void p6(int *A, int *B, long int n) { 516;; for (int i = 0; i < n; i++) { 517;; A[i + 2] = i; 518;; *B++ = A[i]; 519 520define void @p6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 521entry: 522 %cmp1 = icmp sgt i64 %n, 0 523 br i1 %cmp1, label %for.body.preheader, label %for.end 524 525; CHECK-LABEL: p6 526; CHECK: da analyze - none! 527; CHECK: da analyze - consistent flow [2]! 528; CHECK: da analyze - confused! 529; CHECK: da analyze - none! 530; CHECK: da analyze - confused! 531; CHECK: da analyze - none! 532 533for.body.preheader: ; preds = %entry 534 br label %for.body 535 536for.body: ; preds = %for.body.preheader, %for.body 537 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 538 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 539 %0 = add nsw i64 %indvars.iv, 2 540 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %0 541 %1 = trunc i64 %indvars.iv to i32 542 store i32 %1, i32* %arrayidx, align 4 543 %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 544 %2 = load i32, i32* %arrayidx3, align 4 545 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 546 store i32 %2, i32* %B.addr.02, align 4 547 %indvars.iv.next = add i64 %indvars.iv, 1 548 %exitcond = icmp ne i64 %indvars.iv.next, %n 549 br i1 %exitcond, label %for.body, label %for.end.loopexit 550 551for.end.loopexit: ; preds = %for.body 552 br label %for.end 553 554for.end: ; preds = %for.end.loopexit, %entry 555 ret void 556} 557 558 559;;void p7(unsigned *A, unsigned *B, char n) { 560;; A[n] = 0; 561;; *B = A[n + 1]; 562 563define void @p7(i32* %A, i32* %B, i8 signext %n) nounwind uwtable ssp { 564entry: 565 %idxprom = sext i8 %n to i64 566 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom 567 568; CHECK-LABEL: p7 569; CHECK: da analyze - none! 570; CHECK: da analyze - none! 571; CHECK: da analyze - confused! 572; CHECK: da analyze - none! 573; CHECK: da analyze - confused! 574; CHECK: da analyze - none! 575 576 store i32 0, i32* %arrayidx, align 4 577 %conv = sext i8 %n to i64 578 %add = add i64 %conv, 1 579 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add 580 %0 = load i32, i32* %arrayidx2, align 4 581 store i32 %0, i32* %B, align 4 582 ret void 583} 584 585 586;;void p8(unsigned *A, unsigned *B, short n) { 587;; A[n] = 0; 588;; *B = A[n + 1]; 589 590define void @p8(i32* %A, i32* %B, i16 signext %n) nounwind uwtable ssp { 591entry: 592 %idxprom = sext i16 %n to i64 593 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom 594 store i32 0, i32* %arrayidx, align 4 595 596; CHECK-LABEL: p8 597; CHECK: da analyze - none! 598; CHECK: da analyze - none! 599; CHECK: da analyze - confused! 600; CHECK: da analyze - none! 601; CHECK: da analyze - confused! 602; CHECK: da analyze - none! 603 604 %conv = sext i16 %n to i64 605 %add = add i64 %conv, 1 606 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add 607 %0 = load i32, i32* %arrayidx2, align 4 608 store i32 %0, i32* %B, align 4 609 ret void 610} 611 612 613;;void p9(unsigned *A, unsigned *B, int n) { 614;; A[n] = 0; 615;; *B = A[n + 1]; 616 617define void @p9(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { 618entry: 619 %idxprom = sext i32 %n to i64 620 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom 621 store i32 0, i32* %arrayidx, align 4 622 623; CHECK-LABEL: p9 624; CHECK: da analyze - none! 625; CHECK: da analyze - flow [|<]! 626; CHECK: da analyze - confused! 627; CHECK: da analyze - none! 628; CHECK: da analyze - confused! 629; CHECK: da analyze - none! 630 631 %add = add nsw i32 %n, 1 632 %idxprom1 = sext i32 %add to i64 633 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %idxprom1 634 %0 = load i32, i32* %arrayidx2, align 4 635 store i32 %0, i32* %B, align 4 636 ret void 637} 638 639 640;;void p10(unsigned *A, unsigned *B, unsigned n) { 641;; A[n] = 0; 642;; *B = A[n + 1]; 643 644define void @p10(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { 645entry: 646 %idxprom = zext i32 %n to i64 647 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom 648 store i32 0, i32* %arrayidx, align 4 649 650; CHECK-LABEL: p10 651; CHECK: da analyze - none! 652; CHECK: da analyze - flow [|<]! 653; CHECK: da analyze - confused! 654; CHECK: da analyze - none! 655; CHECK: da analyze - confused! 656; CHECK: da analyze - none! 657 658 %add = add i32 %n, 1 659 %idxprom1 = zext i32 %add to i64 660 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %idxprom1 661 %0 = load i32, i32* %arrayidx2, align 4 662 store i32 %0, i32* %B, align 4 663 ret void 664} 665 666 667;;typedef struct { int v; } S; 668;; 669;;void f(S *s, unsigned size) { 670;; S *i = s, *e = s + size - 1; 671;; while (i != e) { 672;; *i = *(i + 1); 673;; ++i; 674 675%struct.S = type { i32 } 676 677define void @foo(%struct.S* %s, i32 %size) nounwind uwtable ssp { 678entry: 679 %idx.ext = zext i32 %size to i64 680 %add.ptr.sum = add i64 %idx.ext, -1 681 %add.ptr1 = getelementptr inbounds %struct.S, %struct.S* %s, i64 %add.ptr.sum 682 %cmp1 = icmp eq i64 %add.ptr.sum, 0 683 br i1 %cmp1, label %while.end, label %while.body.preheader 684 685; CHECK-LABEL: foo 686; CHECK: da analyze - none! 687; CHECK: da analyze - consistent anti [1]! 688; CHECK: da analyze - none! 689 690while.body.preheader: ; preds = %entry 691 br label %while.body 692 693while.body: ; preds = %while.body.preheader, %while.body 694 %i.02 = phi %struct.S* [ %incdec.ptr, %while.body ], [ %s, %while.body.preheader ] 695 %0 = getelementptr inbounds %struct.S, %struct.S* %i.02, i64 1, i32 0 696 %1 = load i32, i32* %0, align 4 697 %2 = getelementptr inbounds %struct.S, %struct.S* %i.02, i64 0, i32 0 698 store i32 %1, i32* %2, align 4 699 %incdec.ptr = getelementptr inbounds %struct.S, %struct.S* %i.02, i64 1 700 %cmp = icmp eq %struct.S* %incdec.ptr, %add.ptr1 701 br i1 %cmp, label %while.end.loopexit, label %while.body 702 703while.end.loopexit: ; preds = %while.body 704 br label %while.end 705 706while.end: ; preds = %while.end.loopexit, %entry 707 ret void 708} 709 710declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind 711