Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
      2 
      3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
      4 target triple = "thumbv8m.main-arm-none-eabi"
      5 
      6 ; CHECK-LABEL: t1
      7 ;;  for (int i = 0; i < n; i++)
      8 ;;   for (int j = 0; j < m; j++)
      9 ;;    for (int k = 0; k < o; k++)
     10 ;;      = A[i*m*o + j*o + k]
     11 ;;     A[i*m*o + j*o + k] =
     12 define void @t1(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
     13 ; CHECK: da analyze - none!
     14 ; CHECK: da analyze - consistent anti [0 0 0|<]!
     15 ; CHECK: da analyze - none!
     16 entry:
     17   %cmp49 = icmp sgt i32 %n, 0
     18   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
     19 
     20 for.cond1.preheader.lr.ph:                        ; preds = %entry
     21   %cmp247 = icmp sgt i32 %m, 0
     22   %cmp645 = icmp sgt i32 %o, 0
     23   br label %for.cond1.preheader
     24 
     25 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
     26   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
     27   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
     28 
     29 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
     30   %mul = mul nsw i32 %i.050, %m
     31   br label %for.cond5.preheader
     32 
     33 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
     34   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
     35   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
     36 
     37 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
     38   %mul944 = add i32 %j.048, %mul
     39   %add = mul i32 %mul944, %o
     40   br label %for.body8
     41 
     42 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
     43   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
     44   %add11 = add nsw i32 %k.046, %add
     45   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
     46   %0 = load i32, i32* %arrayidx, align 4
     47   %add12 = add nsw i32 %0, 1
     48   store i32 %add12, i32* %arrayidx, align 4
     49   %inc = add nuw nsw i32 %k.046, 1
     50   %exitcond = icmp eq i32 %inc, %o
     51   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
     52 
     53 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
     54   %inc20 = add nuw nsw i32 %j.048, 1
     55   %exitcond51 = icmp eq i32 %inc20, %m
     56   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
     57 
     58 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
     59   %inc23 = add nuw nsw i32 %i.050, 1
     60   %exitcond52 = icmp eq i32 %inc23, %n
     61   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
     62 
     63 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
     64   ret void
     65 }
     66 
     67 ; CHECK-LABEL: t2
     68 ;;  for (int i = 0; i < n; i++)
     69 ;;   for (int j = 0; j < m; j++)
     70 ;;    for (int k = 0; k < o; k++)
     71 ;;      = A[i*m*o + j*o + k]
     72 ;;     A[i*m*o + j*o + k + 1] =
     73 define void @t2(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
     74 ; CHECK: da analyze - none!
     75 ; CHECK: da analyze - anti [* * *|<]!
     76 ; CHECK: da analyze - output [* * *]!
     77 entry:
     78   %cmp49 = icmp sgt i32 %n, 0
     79   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
     80 
     81 for.cond1.preheader.lr.ph:                        ; preds = %entry
     82   %cmp247 = icmp sgt i32 %m, 0
     83   %cmp645 = icmp sgt i32 %o, 0
     84   br label %for.cond1.preheader
     85 
     86 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
     87   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
     88   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
     89 
     90 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
     91   %mul = mul nsw i32 %i.050, %m
     92   br label %for.cond5.preheader
     93 
     94 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
     95   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
     96   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
     97 
     98 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
     99   %mul944 = add i32 %j.048, %mul
    100   %add = mul i32 %mul944, %o
    101   br label %for.body8
    102 
    103 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    104   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    105   %add11 = add nsw i32 %k.046, %add
    106   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    107   %0 = load i32, i32* %arrayidx, align 4
    108   %add12 = add nsw i32 %0, 1
    109   %add111 = add nsw i32 %add11, 1
    110   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    111   store i32 %add12, i32* %arrayidx2, align 4
    112   %inc = add nuw nsw i32 %k.046, 1
    113   %exitcond = icmp eq i32 %inc, %o
    114   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    115 
    116 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    117   %inc20 = add nuw nsw i32 %j.048, 1
    118   %exitcond51 = icmp eq i32 %inc20, %m
    119   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    120 
    121 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    122   %inc23 = add nuw nsw i32 %i.050, 1
    123   %exitcond52 = icmp eq i32 %inc23, %n
    124   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    125 
    126 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    127   ret void
    128 }
    129 
    130 ; CHECK-LABEL: t3
    131 ;;  for (int i = 0; i < n; i++)
    132 ;;   for (int j = 0; j < m; j++)
    133 ;;    for (int k = 0; k < o; k++)
    134 ;;      = A[i*m*o + j*o + k]
    135 ;;     A[i*m*o + j*o + k - 1] =
    136 define void @t3(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    137 ; CHECK: da analyze - none!
    138 ; CHECK: da analyze - anti [* * *|<]!
    139 ; CHECK: da analyze - output [* * *]!
    140 entry:
    141   %cmp49 = icmp sgt i32 %n, 0
    142   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    143 
    144 for.cond1.preheader.lr.ph:                        ; preds = %entry
    145   %cmp247 = icmp sgt i32 %m, 0
    146   %cmp645 = icmp sgt i32 %o, 0
    147   br label %for.cond1.preheader
    148 
    149 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    150   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    151   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    152 
    153 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    154   %mul = mul nsw i32 %i.050, %m
    155   br label %for.cond5.preheader
    156 
    157 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    158   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    159   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    160 
    161 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    162   %mul944 = add i32 %j.048, %mul
    163   %add = mul i32 %mul944, %o
    164   br label %for.body8
    165 
    166 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    167   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    168   %add11 = add nsw i32 %k.046, %add
    169   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    170   %0 = load i32, i32* %arrayidx, align 4
    171   %add12 = add nsw i32 %0, 1
    172   %add111 = sub nsw i32 %add11, 1
    173   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    174   store i32 %add12, i32* %arrayidx2, align 4
    175   %inc = add nuw nsw i32 %k.046, 1
    176   %exitcond = icmp eq i32 %inc, %o
    177   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    178 
    179 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    180   %inc20 = add nuw nsw i32 %j.048, 1
    181   %exitcond51 = icmp eq i32 %inc20, %m
    182   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    183 
    184 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    185   %inc23 = add nuw nsw i32 %i.050, 1
    186   %exitcond52 = icmp eq i32 %inc23, %n
    187   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    188 
    189 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    190   ret void
    191 }
    192 
    193 ; CHECK-LABEL: t4
    194 ;;  for (int i = 0; i < n; i++)
    195 ;;   for (int j = 0; j < m; j++)
    196 ;;    for (int k = 0; k < o; k++)
    197 ;;      = A[i*m*o + j*o + k]
    198 ;;     A[i*m*o + j*o + k + o] =
    199 define void @t4(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    200 ; CHECK: da analyze - none!
    201 ; CHECK: da analyze - anti [* * *|<]!
    202 ; CHECK: da analyze - output [* * *]!
    203 entry:
    204   %cmp49 = icmp sgt i32 %n, 0
    205   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    206 
    207 for.cond1.preheader.lr.ph:                        ; preds = %entry
    208   %cmp247 = icmp sgt i32 %m, 0
    209   %cmp645 = icmp sgt i32 %o, 0
    210   br label %for.cond1.preheader
    211 
    212 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    213   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    214   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    215 
    216 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    217   %mul = mul nsw i32 %i.050, %m
    218   br label %for.cond5.preheader
    219 
    220 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    221   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    222   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    223 
    224 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    225   %mul944 = add i32 %j.048, %mul
    226   %add = mul i32 %mul944, %o
    227   br label %for.body8
    228 
    229 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    230   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    231   %add11 = add nsw i32 %k.046, %add
    232   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    233   %0 = load i32, i32* %arrayidx, align 4
    234   %add12 = add nsw i32 %0, 1
    235   %add111 = add nsw i32 %add11, %o
    236   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    237   store i32 %add12, i32* %arrayidx2, align 4
    238   %inc = add nuw nsw i32 %k.046, 1
    239   %exitcond = icmp eq i32 %inc, %o
    240   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    241 
    242 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    243   %inc20 = add nuw nsw i32 %j.048, 1
    244   %exitcond51 = icmp eq i32 %inc20, %m
    245   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    246 
    247 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    248   %inc23 = add nuw nsw i32 %i.050, 1
    249   %exitcond52 = icmp eq i32 %inc23, %n
    250   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    251 
    252 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    253   ret void
    254 }
    255 
    256 ; CHECK-LABEL: t5
    257 ;;  for (int i = 0; i < n; i++)
    258 ;;   for (int j = 0; j < m; j++)
    259 ;;    for (int k = 0; k < o; k++)
    260 ;;      = A[i*m*o + j*o + k]
    261 ;;     A[i*m*o + j*o + k - o] =
    262 define void @t5(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    263 ; CHECK: da analyze - none!
    264 ; CHECK: da analyze - anti [* * *|<]!
    265 ; CHECK: da analyze - output [* * *]!
    266 entry:
    267   %cmp49 = icmp sgt i32 %n, 0
    268   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    269 
    270 for.cond1.preheader.lr.ph:                        ; preds = %entry
    271   %cmp247 = icmp sgt i32 %m, 0
    272   %cmp645 = icmp sgt i32 %o, 0
    273   br label %for.cond1.preheader
    274 
    275 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    276   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    277   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    278 
    279 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    280   %mul = mul nsw i32 %i.050, %m
    281   br label %for.cond5.preheader
    282 
    283 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    284   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    285   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    286 
    287 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    288   %mul944 = add i32 %j.048, %mul
    289   %add = mul i32 %mul944, %o
    290   br label %for.body8
    291 
    292 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    293   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    294   %add11 = add nsw i32 %k.046, %add
    295   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    296   %0 = load i32, i32* %arrayidx, align 4
    297   %add12 = add nsw i32 %0, 1
    298   %add111 = sub nsw i32 %add11, %o
    299   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    300   store i32 %add12, i32* %arrayidx2, align 4
    301   %inc = add nuw nsw i32 %k.046, 1
    302   %exitcond = icmp eq i32 %inc, %o
    303   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    304 
    305 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    306   %inc20 = add nuw nsw i32 %j.048, 1
    307   %exitcond51 = icmp eq i32 %inc20, %m
    308   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    309 
    310 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    311   %inc23 = add nuw nsw i32 %i.050, 1
    312   %exitcond52 = icmp eq i32 %inc23, %n
    313   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    314 
    315 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    316   ret void
    317 }
    318 
    319 ; CHECK-LABEL: t6
    320 ;;  for (int i = 0; i < n; i++)
    321 ;;   for (int j = 0; j < m; j++)
    322 ;;    for (int k = 0; k < o; k++)
    323 ;;      = A[i*m*o + j*o + k]
    324 ;;     A[i*m*o + j*o + k + m*o] =
    325 define void @t6(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    326 ; CHECK: da analyze - none!
    327 ; CHECK: da analyze - consistent anti [-1 0 0]!
    328 ; CHECK: da analyze - none!
    329 entry:
    330   %cmp49 = icmp sgt i32 %n, 0
    331   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    332 
    333 for.cond1.preheader.lr.ph:                        ; preds = %entry
    334   %cmp247 = icmp sgt i32 %m, 0
    335   %cmp645 = icmp sgt i32 %o, 0
    336   br label %for.cond1.preheader
    337 
    338 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    339   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    340   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    341 
    342 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    343   %mul = mul nsw i32 %i.050, %m
    344   br label %for.cond5.preheader
    345 
    346 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    347   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    348   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    349 
    350 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    351   %mul944 = add i32 %j.048, %mul
    352   %add = mul i32 %mul944, %o
    353   br label %for.body8
    354 
    355 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    356   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    357   %add11 = add nsw i32 %k.046, %add
    358   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    359   %0 = load i32, i32* %arrayidx, align 4
    360   %add12 = add nsw i32 %0, 1
    361   %mo = mul i32 %m, %o
    362   %add111 = add nsw i32 %add11, %mo
    363   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    364   store i32 %add12, i32* %arrayidx2, align 4
    365   %inc = add nuw nsw i32 %k.046, 1
    366   %exitcond = icmp eq i32 %inc, %o
    367   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    368 
    369 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    370   %inc20 = add nuw nsw i32 %j.048, 1
    371   %exitcond51 = icmp eq i32 %inc20, %m
    372   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    373 
    374 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    375   %inc23 = add nuw nsw i32 %i.050, 1
    376   %exitcond52 = icmp eq i32 %inc23, %n
    377   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    378 
    379 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    380   ret void
    381 }
    382 
    383 ; CHECK-LABEL: t7
    384 ;;  for (int i = 0; i < n; i++)
    385 ;;   for (int j = 0; j < m; j++)
    386 ;;    for (int k = 0; k < o; k++)
    387 ;;      = A[i*m*o + j*o + k]
    388 ;;     A[i*m*o + j*o + k - m*o] =
    389 define void @t7(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    390 ; CHECK: da analyze - none!
    391 ; CHECK: da analyze - consistent anti [1 0 0]!
    392 ; CHECK: da analyze - none!
    393 entry:
    394   %cmp49 = icmp sgt i32 %n, 0
    395   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    396 
    397 for.cond1.preheader.lr.ph:                        ; preds = %entry
    398   %cmp247 = icmp sgt i32 %m, 0
    399   %cmp645 = icmp sgt i32 %o, 0
    400   br label %for.cond1.preheader
    401 
    402 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    403   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    404   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    405 
    406 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    407   %mul = mul nsw i32 %i.050, %m
    408   br label %for.cond5.preheader
    409 
    410 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    411   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    412   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    413 
    414 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    415   %mul944 = add i32 %j.048, %mul
    416   %add = mul i32 %mul944, %o
    417   br label %for.body8
    418 
    419 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    420   %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    421   %add11 = add nsw i32 %k.046, %add
    422   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    423   %0 = load i32, i32* %arrayidx, align 4
    424   %add12 = add nsw i32 %0, 1
    425   %mo = mul i32 %m, %o
    426   %add111 = sub nsw i32 %add11, %mo
    427   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    428   store i32 %add12, i32* %arrayidx2, align 4
    429   %inc = add nuw nsw i32 %k.046, 1
    430   %exitcond = icmp eq i32 %inc, %o
    431   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    432 
    433 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    434   %inc20 = add nuw nsw i32 %j.048, 1
    435   %exitcond51 = icmp eq i32 %inc20, %m
    436   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    437 
    438 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    439   %inc23 = add nuw nsw i32 %i.050, 1
    440   %exitcond52 = icmp eq i32 %inc23, %n
    441   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    442 
    443 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    444   ret void
    445 }
    446 
    447 ; CHECK-LABEL: t8
    448 ;;  for (int i = 0; i < n; i++)
    449 ;;   for (int j = 0; j < m; j++)
    450 ;;    for (int k = 1; k < o; k++)
    451 ;;      = A[i*m*o + j*o + k]
    452 ;;     A[i*m*o + j*o + k - 1] =
    453 define void @t8(i32 %n, i32 %m, i32 %o, i32* nocapture %A) {
    454 ; CHECK: da analyze - none!
    455 ; CHECK: da analyze - consistent anti [0 0 1]!
    456 ; CHECK: da analyze - none!
    457 entry:
    458   %cmp49 = icmp sgt i32 %n, 0
    459   br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
    460 
    461 for.cond1.preheader.lr.ph:                        ; preds = %entry
    462   %cmp247 = icmp sgt i32 %m, 0
    463   %cmp645 = icmp sgt i32 %o, 0
    464   br label %for.cond1.preheader
    465 
    466 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
    467   %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
    468   br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
    469 
    470 for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
    471   %mul = mul nsw i32 %i.050, %m
    472   br label %for.cond5.preheader
    473 
    474 for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
    475   %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
    476   br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
    477 
    478 for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
    479   %mul944 = add i32 %j.048, %mul
    480   %add = mul i32 %mul944, %o
    481   br label %for.body8
    482 
    483 for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
    484   %k.046 = phi i32 [ 1, %for.body8.lr.ph ], [ %inc, %for.body8 ]
    485   %add11 = add nsw i32 %k.046, %add
    486   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add11
    487   %0 = load i32, i32* %arrayidx, align 4
    488   %add12 = add nsw i32 %0, 1
    489   %add111 = sub nsw i32 %add11, 1
    490   %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %add111
    491   store i32 %add12, i32* %arrayidx2, align 4
    492   %inc = add nuw nsw i32 %k.046, 1
    493   %exitcond = icmp eq i32 %inc, %o
    494   br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
    495 
    496 for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
    497   %inc20 = add nuw nsw i32 %j.048, 1
    498   %exitcond51 = icmp eq i32 %inc20, %m
    499   br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
    500 
    501 for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
    502   %inc23 = add nuw nsw i32 %i.050, 1
    503   %exitcond52 = icmp eq i32 %inc23, %n
    504   br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
    505 
    506 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
    507   ret void
    508 }
    509 
    510 
    511 ; CHECK-LABEL: test_sizes
    512 define double @test_sizes(i16 %h, i16 %N, i16* nocapture %array) {
    513 ; CHECK: da analyze - consistent input [0 S]!
    514 ; CHECK: da analyze - anti [* *|<]!
    515 ; CHECK: da analyze - output [* *]!
    516 entry:
    517   %cmp28 = icmp sgt i16 %N, 1
    518   br i1 %cmp28, label %for.body.lr.ph, label %for.end12
    519 
    520 for.body.lr.ph:                                   ; preds = %entry
    521   %cmp425 = icmp slt i16 %h, 0
    522   %0 = add i16 %h, 1
    523   %wide.trip.count = zext i16 %N to i32
    524   br label %for.body
    525 
    526 for.body:                                         ; preds = %for.inc10, %for.body.lr.ph
    527   %indvars.iv32 = phi i32 [ 1, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc10 ]
    528   %indvars.iv = phi i16 [ 2, %for.body.lr.ph ], [ %indvars.iv.next, %for.inc10 ]
    529   br i1 %cmp425, label %for.inc10, label %for.body5.lr.ph
    530 
    531 for.body5.lr.ph:                                  ; preds = %for.body
    532   %1 = sext i16 %indvars.iv to i32
    533   %arrayidx = getelementptr inbounds i16, i16* %array, i32 %indvars.iv32
    534   br label %for.body5
    535 
    536 for.body5:                                        ; preds = %for.body5, %for.body5.lr.ph
    537   %indvars.iv30 = phi i32 [ %indvars.iv.next31, %for.body5 ], [ %1, %for.body5.lr.ph ]
    538   %j.027 = phi i16 [ %inc, %for.body5 ], [ 0, %for.body5.lr.ph ]
    539   %2 = load i16, i16* %arrayidx, align 4
    540   %add6 = add nsw i16 %2, %j.027
    541   %arrayidx8 = getelementptr inbounds i16, i16* %array, i32 %indvars.iv30
    542   store i16 %add6, i16* %arrayidx8, align 4
    543   %inc = add nuw nsw i16 %j.027, 1
    544   %indvars.iv.next31 = add nsw i32 %indvars.iv30, 1
    545   %exitcond = icmp eq i16 %inc, %0
    546   br i1 %exitcond, label %for.inc10, label %for.body5
    547 
    548 for.inc10:                                        ; preds = %for.body5, %for.body
    549   %indvars.iv.next33 = add nuw nsw i32 %indvars.iv32, 1
    550   %indvars.iv.next = add i16 %indvars.iv, %0
    551   %exitcond34 = icmp eq i32 %indvars.iv.next33, %wide.trip.count
    552   br i1 %exitcond34, label %for.end12, label %for.body
    553 
    554 for.end12:                                        ; preds = %for.inc10, %entry
    555   ret double undef
    556 }
    557 
    558 
    559 ; CHECK-LABEL: nonnegative
    560 define void @nonnegative(i32* nocapture %A, i32 %N) {
    561 ; CHECK: da analyze - none!
    562 ; CHECK: da analyze - consistent output [0 0|<]!
    563 ; CHECK: da analyze - none!
    564 entry:
    565   %cmp44 = icmp eq i32 %N, 0
    566   br i1 %cmp44, label %exit, label %for.outer
    567 
    568 for.outer:
    569   %h.045 = phi i32 [ %add19, %for.latch ], [ 0, %entry ]
    570   %mul = mul i32 %h.045, %N
    571   br label %for.inner
    572 
    573 for.inner:
    574   %i.043 = phi i32 [ 0, %for.outer ], [ %add16, %for.inner ]
    575   %add = add i32 %i.043, %mul
    576   %arrayidx = getelementptr inbounds i32, i32* %A, i32 %add
    577   store i32 1, i32* %arrayidx, align 4
    578   store i32 2, i32* %arrayidx, align 4
    579   %add16 = add nuw i32 %i.043, 1
    580   %exitcond46 = icmp eq i32 %add16, %N
    581   br i1 %exitcond46, label %for.latch, label %for.inner
    582 
    583 for.latch:
    584   %add19 = add nuw i32 %h.045, 1
    585   %exitcond47 = icmp eq i32 %add19, %N
    586   br i1 %exitcond47, label %exit, label %for.outer
    587 
    588 exit:
    589   ret void
    590 }
    591