1; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ 2; RUN: | FileCheck %s 3 4; ModuleID = 'WeakZeroDstSIV.bc' 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 (int i = 0; i < N; i++) { 10;; A[i] = 1; 11;; A[0] = 2; 12 13define void @dstzero(i32* nocapture %A, i32 %N) { 14entry: 15 %cmp6 = icmp sgt i32 %N, 0 16 br i1 %cmp6, label %for.body, label %for.cond.cleanup 17 18; CHECK: da analyze - none! 19; CHECK: da analyze - output [p<=|<]! 20; CHECK: da analyze - consistent output [S]! 21 22for.body: ; preds = %entry, %for.body 23 %i.07 = phi i32 [ %add, %for.body ], [ 0, %entry ] 24 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i.07 25 store i32 0, i32* %arrayidx, align 4 26 store i32 1, i32* %A, align 4 27 %add = add nuw nsw i32 %i.07, 1 28 %exitcond = icmp eq i32 %add, %N 29 br i1 %exitcond, label %for.cond.cleanup, label %for.body 30 31for.cond.cleanup: ; preds = %for.body, %entry 32 ret void 33} 34 35 36 37 38;; for (long unsigned i = 0; i < 30; i++) { 39;; A[2*i + 10] = i; 40;; *B++ = A[10]; 41 42define void @weakzerodst0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 43entry: 44 br label %for.body 45 46; CHECK: da analyze - none! 47; CHECK: da analyze - flow [p<=|<]! 48; CHECK: da analyze - confused! 49; CHECK: da analyze - consistent input [S]! 50; CHECK: da analyze - confused! 51; CHECK: da analyze - none! 52 53for.body: ; preds = %entry, %for.body 54 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 55 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 56 %conv = trunc i64 %i.02 to i32 57 %mul = shl i64 %i.02, 1 58 %add = add i64 %mul, 10 59 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 60 store i32 %conv, i32* %arrayidx, align 4 61 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 62 %0 = load i32, i32* %arrayidx1, align 4 63 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 64 store i32 %0, i32* %B.addr.01, align 4 65 %inc = add i64 %i.02, 1 66 %exitcond = icmp ne i64 %inc, 30 67 br i1 %exitcond, label %for.body, label %for.end 68 69for.end: ; preds = %for.body 70 ret void 71} 72 73 74;; for (long unsigned i = 0; i < n; i++) { 75;; A[n*i + 10] = i; 76;; *B++ = A[10]; 77 78define void @weakzerodst1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 79entry: 80 %cmp1 = icmp eq i64 %n, 0 81 br i1 %cmp1, label %for.end, label %for.body.preheader 82 83; CHECK: da analyze - none! 84; CHECK: da analyze - flow [p<=|<]! 85; CHECK: da analyze - confused! 86; CHECK: da analyze - consistent input [S]! 87; CHECK: da analyze - confused! 88; CHECK: da analyze - none! 89 90for.body.preheader: ; preds = %entry 91 br label %for.body 92 93for.body: ; preds = %for.body.preheader, %for.body 94 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 95 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 96 %conv = trunc i64 %i.03 to i32 97 %mul = mul i64 %i.03, %n 98 %add = add i64 %mul, 10 99 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add 100 store i32 %conv, i32* %arrayidx, align 4 101 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 102 %0 = load i32, i32* %arrayidx1, align 4 103 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 104 store i32 %0, i32* %B.addr.02, align 4 105 %inc = add i64 %i.03, 1 106 %exitcond = icmp ne i64 %inc, %n 107 br i1 %exitcond, label %for.body, label %for.end.loopexit 108 109for.end.loopexit: ; preds = %for.body 110 br label %for.end 111 112for.end: ; preds = %for.end.loopexit, %entry 113 ret void 114} 115 116 117;; for (long unsigned i = 0; i < 5; i++) { 118;; A[2*i] = i; 119;; *B++ = A[10]; 120 121define void @weakzerodst2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 122entry: 123 br label %for.body 124 125; CHECK: da analyze - none! 126; CHECK: da analyze - none! 127; CHECK: da analyze - confused! 128; CHECK: da analyze - consistent input [S]! 129; CHECK: da analyze - confused! 130; CHECK: da analyze - none! 131 132for.body: ; preds = %entry, %for.body 133 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 134 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 135 %conv = trunc i64 %i.02 to i32 136 %mul = shl i64 %i.02, 1 137 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 138 store i32 %conv, i32* %arrayidx, align 4 139 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 140 %0 = load i32, i32* %arrayidx1, align 4 141 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 142 store i32 %0, i32* %B.addr.01, align 4 143 %inc = add i64 %i.02, 1 144 %exitcond = icmp ne i64 %inc, 5 145 br i1 %exitcond, label %for.body, label %for.end 146 147for.end: ; preds = %for.body 148 ret void 149} 150 151 152;; for (long unsigned i = 0; i < 6; i++) { 153;; A[2*i] = i; 154;; *B++ = A[10]; 155 156define void @weakzerodst3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 157entry: 158 br label %for.body 159 160; CHECK: da analyze - none! 161; CHECK: da analyze - flow [=>p|<]! 162; CHECK: da analyze - confused! 163; CHECK: da analyze - consistent input [S]! 164; CHECK: da analyze - confused! 165; CHECK: da analyze - none! 166 167for.body: ; preds = %entry, %for.body 168 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 169 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 170 %conv = trunc i64 %i.02 to i32 171 %mul = shl i64 %i.02, 1 172 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 173 store i32 %conv, i32* %arrayidx, align 4 174 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 175 %0 = load i32, i32* %arrayidx1, align 4 176 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 177 store i32 %0, i32* %B.addr.01, align 4 178 %inc = add i64 %i.02, 1 179 %exitcond = icmp ne i64 %inc, 6 180 br i1 %exitcond, label %for.body, label %for.end 181 182for.end: ; preds = %for.body 183 ret void 184} 185 186 187;; for (long unsigned i = 0; i < 7; i++) { 188;; A[2*i] = i; 189;; *B++ = A[10]; 190 191define void @weakzerodst4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 192entry: 193 br label %for.body 194 195; CHECK: da analyze - none! 196; CHECK: da analyze - flow [*|<]! 197; CHECK: da analyze - confused! 198; CHECK: da analyze - consistent input [S]! 199; CHECK: da analyze - confused! 200; CHECK: da analyze - none! 201 202for.body: ; preds = %entry, %for.body 203 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 204 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 205 %conv = trunc i64 %i.02 to i32 206 %mul = shl i64 %i.02, 1 207 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 208 store i32 %conv, i32* %arrayidx, align 4 209 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 210 %0 = load i32, i32* %arrayidx1, align 4 211 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 212 store i32 %0, i32* %B.addr.01, align 4 213 %inc = add i64 %i.02, 1 214 %exitcond = icmp ne i64 %inc, 7 215 br i1 %exitcond, label %for.body, label %for.end 216 217for.end: ; preds = %for.body 218 ret void 219} 220 221 222;; for (long unsigned i = 0; i < 7; i++) { 223;; A[2*i] = i; 224;; *B++ = A[-10]; 225 226define void @weakzerodst5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 227entry: 228 br label %for.body 229 230; CHECK: da analyze - none! 231; CHECK: da analyze - none! 232; CHECK: da analyze - confused! 233; CHECK: da analyze - consistent input [S]! 234; CHECK: da analyze - confused! 235; CHECK: da analyze - none! 236 237for.body: ; preds = %entry, %for.body 238 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 239 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] 240 %conv = trunc i64 %i.02 to i32 241 %mul = shl i64 %i.02, 1 242 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 243 store i32 %conv, i32* %arrayidx, align 4 244 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 -10 245 %0 = load i32, i32* %arrayidx1, align 4 246 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1 247 store i32 %0, i32* %B.addr.01, align 4 248 %inc = add i64 %i.02, 1 249 %exitcond = icmp ne i64 %inc, 7 250 br i1 %exitcond, label %for.body, label %for.end 251 252for.end: ; preds = %for.body 253 ret void 254} 255 256 257;; for (long unsigned i = 0; i < n; i++) { 258;; A[3*i] = i; 259;; *B++ = A[10]; 260 261define void @weakzerodst6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { 262entry: 263 %cmp1 = icmp eq i64 %n, 0 264 br i1 %cmp1, label %for.end, label %for.body.preheader 265 266; CHECK: da analyze - none! 267; CHECK: da analyze - none! 268; CHECK: da analyze - confused! 269; CHECK: da analyze - consistent input [S]! 270; CHECK: da analyze - confused! 271; CHECK: da analyze - none! 272 273for.body.preheader: ; preds = %entry 274 br label %for.body 275 276for.body: ; preds = %for.body.preheader, %for.body 277 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 278 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 279 %conv = trunc i64 %i.03 to i32 280 %mul = mul i64 %i.03, 3 281 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul 282 store i32 %conv, i32* %arrayidx, align 4 283 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10 284 %0 = load i32, i32* %arrayidx1, align 4 285 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1 286 store i32 %0, i32* %B.addr.02, align 4 287 %inc = add i64 %i.03, 1 288 %exitcond = icmp ne i64 %inc, %n 289 br i1 %exitcond, label %for.body, label %for.end.loopexit 290 291for.end.loopexit: ; preds = %for.body 292 br label %for.end 293 294for.end: ; preds = %for.end.loopexit, %entry 295 ret void 296} 297