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