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