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