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