Home | History | Annotate | Download | only in DependenceAnalysis
      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