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