Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
      2 
      3 ; ModuleID = 'GCD.bc'
      4 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      5 target triple = "x86_64-apple-macosx10.6.0"
      6 
      7 
      8 ;;  for (long int i = 0; i < 100; i++)
      9 ;;    for (long int j = 0; j < 100; j++) {
     10 ;;      A[2*i - 4*j] = i;
     11 ;;      *B++ = A[6*i + 8*j];
     12 
     13 define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
     14 entry:
     15   br label %for.cond1.preheader
     16 
     17 ; CHECK: da analyze - output [* *]!
     18 ; CHECK: da analyze - flow [=> *|<]!
     19 ; CHECK: da analyze - confused!
     20 ; CHECK: da analyze - input [* *]!
     21 ; CHECK: da analyze - confused!
     22 ; CHECK: da analyze - none!
     23 
     24 for.cond1.preheader:                              ; preds = %entry, %for.inc8
     25   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
     26   %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
     27   br label %for.body3
     28 
     29 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
     30   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
     31   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
     32   %conv = trunc i64 %i.03 to i32
     33   %mul = shl nsw i64 %i.03, 1
     34   %mul4 = shl nsw i64 %j.02, 2
     35   %sub = sub nsw i64 %mul, %mul4
     36   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
     37   store i32 %conv, i32* %arrayidx, align 4
     38   %mul5 = mul nsw i64 %i.03, 6
     39   %mul6 = shl nsw i64 %j.02, 3
     40   %add = add nsw i64 %mul5, %mul6
     41   %arrayidx7 = getelementptr inbounds i32* %A, i64 %add
     42   %0 = load i32* %arrayidx7, align 4
     43   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
     44   store i32 %0, i32* %B.addr.11, align 4
     45   %inc = add nsw i64 %j.02, 1
     46   %exitcond = icmp ne i64 %inc, 100
     47   br i1 %exitcond, label %for.body3, label %for.inc8
     48 
     49 for.inc8:                                         ; preds = %for.body3
     50   %scevgep = getelementptr i32* %B.addr.04, i64 100
     51   %inc9 = add nsw i64 %i.03, 1
     52   %exitcond5 = icmp ne i64 %inc9, 100
     53   br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
     54 
     55 for.end10:                                        ; preds = %for.inc8
     56   ret void
     57 }
     58 
     59 
     60 ;;  for (long int i = 0; i < 100; i++)
     61 ;;    for (long int j = 0; j < 100; j++) {
     62 ;;      A[2*i - 4*j] = i;
     63 ;;      *B++ = A[6*i + 8*j + 1];
     64 
     65 define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
     66 entry:
     67   br label %for.cond1.preheader
     68 
     69 ; CHECK: da analyze - output [* *]!
     70 ; CHECK: da analyze - none!
     71 ; CHECK: da analyze - confused!
     72 ; CHECK: da analyze - input [* *]!
     73 ; CHECK: da analyze - confused!
     74 ; CHECK: da analyze - none!
     75 
     76 for.cond1.preheader:                              ; preds = %entry, %for.inc9
     77   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
     78   %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
     79   br label %for.body3
     80 
     81 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
     82   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
     83   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
     84   %conv = trunc i64 %i.03 to i32
     85   %mul = shl nsw i64 %i.03, 1
     86   %mul4 = shl nsw i64 %j.02, 2
     87   %sub = sub nsw i64 %mul, %mul4
     88   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
     89   store i32 %conv, i32* %arrayidx, align 4
     90   %mul5 = mul nsw i64 %i.03, 6
     91   %mul6 = shl nsw i64 %j.02, 3
     92   %add = add nsw i64 %mul5, %mul6
     93   %add7 = or i64 %add, 1
     94   %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
     95   %0 = load i32* %arrayidx8, align 4
     96   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
     97   store i32 %0, i32* %B.addr.11, align 4
     98   %inc = add nsw i64 %j.02, 1
     99   %exitcond = icmp ne i64 %inc, 100
    100   br i1 %exitcond, label %for.body3, label %for.inc9
    101 
    102 for.inc9:                                         ; preds = %for.body3
    103   %scevgep = getelementptr i32* %B.addr.04, i64 100
    104   %inc10 = add nsw i64 %i.03, 1
    105   %exitcond5 = icmp ne i64 %inc10, 100
    106   br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
    107 
    108 for.end11:                                        ; preds = %for.inc9
    109   ret void
    110 }
    111 
    112 
    113 ;;  for (long int i = 0; i < 100; i++)
    114 ;;    for (long int j = 0; j < 100; j++) {
    115 ;;      A[2*i - 4*j + 1] = i;
    116 ;;      *B++ = A[6*i + 8*j];
    117 
    118 define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
    119 entry:
    120   br label %for.cond1.preheader
    121 
    122 ; CHECK: da analyze - output [* *]!
    123 ; CHECK: da analyze - none!
    124 ; CHECK: da analyze - confused!
    125 ; CHECK: da analyze - input [* *]!
    126 ; CHECK: da analyze - confused!
    127 ; CHECK: da analyze - none!
    128 
    129 for.cond1.preheader:                              ; preds = %entry, %for.inc9
    130   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
    131   %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
    132   br label %for.body3
    133 
    134 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
    135   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
    136   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
    137   %conv = trunc i64 %i.03 to i32
    138   %mul = shl nsw i64 %i.03, 1
    139   %mul4 = shl nsw i64 %j.02, 2
    140   %sub = sub nsw i64 %mul, %mul4
    141   %add5 = or i64 %sub, 1
    142   %arrayidx = getelementptr inbounds i32* %A, i64 %add5
    143   store i32 %conv, i32* %arrayidx, align 4
    144   %mul5 = mul nsw i64 %i.03, 6
    145   %mul6 = shl nsw i64 %j.02, 3
    146   %add7 = add nsw i64 %mul5, %mul6
    147   %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
    148   %0 = load i32* %arrayidx8, align 4
    149   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
    150   store i32 %0, i32* %B.addr.11, align 4
    151   %inc = add nsw i64 %j.02, 1
    152   %exitcond = icmp ne i64 %inc, 100
    153   br i1 %exitcond, label %for.body3, label %for.inc9
    154 
    155 for.inc9:                                         ; preds = %for.body3
    156   %scevgep = getelementptr i32* %B.addr.04, i64 100
    157   %inc10 = add nsw i64 %i.03, 1
    158   %exitcond6 = icmp ne i64 %inc10, 100
    159   br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
    160 
    161 for.end11:                                        ; preds = %for.inc9
    162   ret void
    163 }
    164 
    165 
    166 ;;  for (long int i = 0; i < 100; i++)
    167 ;;    for (long int j = 0; j < 100; j++) {
    168 ;;      A[i + 2*j] = i;
    169 ;;      *B++ = A[i + 2*j - 1];
    170 
    171 define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
    172 entry:
    173   br label %for.cond1.preheader
    174 
    175 ; CHECK: da analyze - output [* *]!
    176 ; CHECK: da analyze - flow [<> *]!
    177 ; CHECK: da analyze - confused!
    178 ; CHECK: da analyze - input [* *]!
    179 ; CHECK: da analyze - confused!
    180 ; CHECK: da analyze - none!
    181 
    182 for.cond1.preheader:                              ; preds = %entry, %for.inc7
    183   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
    184   %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
    185   br label %for.body3
    186 
    187 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
    188   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
    189   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
    190   %conv = trunc i64 %i.03 to i32
    191   %mul = shl nsw i64 %j.02, 1
    192   %add = add nsw i64 %i.03, %mul
    193   %arrayidx = getelementptr inbounds i32* %A, i64 %add
    194   store i32 %conv, i32* %arrayidx, align 4
    195   %mul4 = shl nsw i64 %j.02, 1
    196   %add5 = add nsw i64 %i.03, %mul4
    197   %sub = add nsw i64 %add5, -1
    198   %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub
    199   %0 = load i32* %arrayidx6, align 4
    200   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
    201   store i32 %0, i32* %B.addr.11, align 4
    202   %inc = add nsw i64 %j.02, 1
    203   %exitcond = icmp ne i64 %inc, 100
    204   br i1 %exitcond, label %for.body3, label %for.inc7
    205 
    206 for.inc7:                                         ; preds = %for.body3
    207   %scevgep = getelementptr i32* %B.addr.04, i64 100
    208   %inc8 = add nsw i64 %i.03, 1
    209   %exitcond5 = icmp ne i64 %inc8, 100
    210   br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
    211 
    212 for.end9:                                         ; preds = %for.inc7
    213   ret void
    214 }
    215 
    216 
    217 ;;  for (long int i = 0; i < 100; i++)
    218 ;;    for (long int j = 0; j < 100; j++) {
    219 ;;      A[5*i + 10*j*M + 9*M*N] = i;
    220 ;;      *B++ = A[15*i + 20*j*M - 21*N*M + 4];
    221 
    222 define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
    223 entry:
    224   br label %for.cond1.preheader
    225 
    226 ; CHECK: da analyze - output [* *]!
    227 ; CHECK: da analyze - none!
    228 ; CHECK: da analyze - confused!
    229 ; CHECK: da analyze - input [* *]!
    230 ; CHECK: da analyze - confused!
    231 ; CHECK: da analyze - none!
    232 
    233 for.cond1.preheader:                              ; preds = %entry, %for.inc17
    234   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
    235   %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
    236   br label %for.body3
    237 
    238 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
    239   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
    240   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
    241   %conv = trunc i64 %i.03 to i32
    242   %mul = mul nsw i64 %i.03, 5
    243   %mul4 = mul nsw i64 %j.02, 10
    244   %mul5 = mul nsw i64 %mul4, %M
    245   %add = add nsw i64 %mul, %mul5
    246   %mul6 = mul nsw i64 %M, 9
    247   %mul7 = mul nsw i64 %mul6, %N
    248   %add8 = add nsw i64 %add, %mul7
    249   %arrayidx = getelementptr inbounds i32* %A, i64 %add8
    250   store i32 %conv, i32* %arrayidx, align 4
    251   %mul9 = mul nsw i64 %i.03, 15
    252   %mul10 = mul nsw i64 %j.02, 20
    253   %mul11 = mul nsw i64 %mul10, %M
    254   %add12 = add nsw i64 %mul9, %mul11
    255   %mul13 = mul nsw i64 %N, 21
    256   %mul14 = mul nsw i64 %mul13, %M
    257   %sub = sub nsw i64 %add12, %mul14
    258   %add15 = add nsw i64 %sub, 4
    259   %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
    260   %0 = load i32* %arrayidx16, align 4
    261   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
    262   store i32 %0, i32* %B.addr.11, align 4
    263   %inc = add nsw i64 %j.02, 1
    264   %exitcond = icmp ne i64 %inc, 100
    265   br i1 %exitcond, label %for.body3, label %for.inc17
    266 
    267 for.inc17:                                        ; preds = %for.body3
    268   %scevgep = getelementptr i32* %B.addr.04, i64 100
    269   %inc18 = add nsw i64 %i.03, 1
    270   %exitcond5 = icmp ne i64 %inc18, 100
    271   br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
    272 
    273 for.end19:                                        ; preds = %for.inc17
    274   ret void
    275 }
    276 
    277 
    278 ;;  for (long int i = 0; i < 100; i++)
    279 ;;    for (long int j = 0; j < 100; j++) {
    280 ;;      A[5*i + 10*j*M + 9*M*N] = i;
    281 ;;      *B++ = A[15*i + 20*j*M - 21*N*M + 5];
    282 
    283 define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
    284 entry:
    285   br label %for.cond1.preheader
    286 
    287 ; CHECK: da analyze - output [* *]!
    288 ; CHECK: da analyze - flow [<> *]!
    289 ; CHECK: da analyze - confused!
    290 ; CHECK: da analyze - input [* *]!
    291 ; CHECK: da analyze - confused!
    292 ; CHECK: da analyze - none!
    293 
    294 for.cond1.preheader:                              ; preds = %entry, %for.inc17
    295   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
    296   %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
    297   br label %for.body3
    298 
    299 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
    300   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
    301   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
    302   %conv = trunc i64 %i.03 to i32
    303   %mul = mul nsw i64 %i.03, 5
    304   %mul4 = mul nsw i64 %j.02, 10
    305   %mul5 = mul nsw i64 %mul4, %M
    306   %add = add nsw i64 %mul, %mul5
    307   %mul6 = mul nsw i64 %M, 9
    308   %mul7 = mul nsw i64 %mul6, %N
    309   %add8 = add nsw i64 %add, %mul7
    310   %arrayidx = getelementptr inbounds i32* %A, i64 %add8
    311   store i32 %conv, i32* %arrayidx, align 4
    312   %mul9 = mul nsw i64 %i.03, 15
    313   %mul10 = mul nsw i64 %j.02, 20
    314   %mul11 = mul nsw i64 %mul10, %M
    315   %add12 = add nsw i64 %mul9, %mul11
    316   %mul13 = mul nsw i64 %N, 21
    317   %mul14 = mul nsw i64 %mul13, %M
    318   %sub = sub nsw i64 %add12, %mul14
    319   %add15 = add nsw i64 %sub, 5
    320   %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
    321   %0 = load i32* %arrayidx16, align 4
    322   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
    323   store i32 %0, i32* %B.addr.11, align 4
    324   %inc = add nsw i64 %j.02, 1
    325   %exitcond = icmp ne i64 %inc, 100
    326   br i1 %exitcond, label %for.body3, label %for.inc17
    327 
    328 for.inc17:                                        ; preds = %for.body3
    329   %scevgep = getelementptr i32* %B.addr.04, i64 100
    330   %inc18 = add nsw i64 %i.03, 1
    331   %exitcond5 = icmp ne i64 %inc18, 100
    332   br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
    333 
    334 for.end19:                                        ; preds = %for.inc17
    335   ret void
    336 }
    337 
    338 
    339 ;;  for (long int i = 0; i < n; i++)
    340 ;;    for (long int j = 0; j < n; j++) {
    341 ;;      A[2*i][4*j] = i;
    342 ;;      *B++ = A[8*i][6*j + 1];
    343 
    344 define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
    345 entry:
    346   %cmp4 = icmp sgt i64 %n, 0
    347   br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
    348 
    349 ; CHECK: da analyze - output [* *]!
    350 ; CHECK: da analyze - none!
    351 ; CHECK: da analyze - confused!
    352 ; CHECK: da analyze - input [* *]!
    353 ; CHECK: da analyze - confused!
    354 ; CHECK: da analyze - output [* *]!
    355 
    356 for.cond1.preheader.preheader:                    ; preds = %entry
    357   br label %for.cond1.preheader
    358 
    359 for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc10
    360   %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
    361   %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
    362   %cmp21 = icmp sgt i64 %n, 0
    363   br i1 %cmp21, label %for.body3.preheader, label %for.inc10
    364 
    365 for.body3.preheader:                              ; preds = %for.cond1.preheader
    366   br label %for.body3
    367 
    368 for.body3:                                        ; preds = %for.body3.preheader, %for.body3
    369   %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
    370   %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
    371   %conv = trunc i64 %i.06 to i32
    372   %mul = shl nsw i64 %j.03, 2
    373   %mul4 = shl nsw i64 %i.06, 1
    374   %0 = mul nsw i64 %mul4, %n
    375   %arrayidx.sum = add i64 %0, %mul
    376   %arrayidx5 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
    377   store i32 %conv, i32* %arrayidx5, align 4
    378   %mul6 = mul nsw i64 %j.03, 6
    379   %add7 = or i64 %mul6, 1
    380   %mul7 = shl nsw i64 %i.06, 3
    381   %1 = mul nsw i64 %mul7, %n
    382   %arrayidx8.sum = add i64 %1, %add7
    383   %arrayidx9 = getelementptr inbounds i32* %A, i64 %arrayidx8.sum
    384   %2 = load i32* %arrayidx9, align 4
    385   %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
    386   store i32 %2, i32* %B.addr.12, align 4
    387   %inc = add nsw i64 %j.03, 1
    388   %exitcond = icmp ne i64 %inc, %n
    389   br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
    390 
    391 for.inc10.loopexit:                               ; preds = %for.body3
    392   %scevgep = getelementptr i32* %B.addr.05, i64 %n
    393   br label %for.inc10
    394 
    395 for.inc10:                                        ; preds = %for.inc10.loopexit, %for.cond1.preheader
    396   %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
    397   %inc11 = add nsw i64 %i.06, 1
    398   %exitcond8 = icmp ne i64 %inc11, %n
    399   br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
    400 
    401 for.end12.loopexit:                               ; preds = %for.inc10
    402   br label %for.end12
    403 
    404 for.end12:                                        ; preds = %for.end12.loopexit, %entry
    405   ret void
    406 }
    407 
    408 
    409 ;;  for (int i = 0; i < n; i++)
    410 ;;   for (int j = 0; j < n; j++) {
    411 ;;    A[2*i][4*j] = i;
    412 ;;   *B++ = A[8*i][6*j + 1];
    413 
    414 define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
    415 entry:
    416   %0 = zext i32 %n to i64
    417   %cmp4 = icmp sgt i32 %n, 0
    418   br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
    419 
    420 ; CHECK: da analyze - output [* *]!
    421 ; CHECK: da analyze - flow [* *|<]!
    422 ; CHECK: da analyze - confused!
    423 ; CHECK: da analyze - input [* *]!
    424 ; CHECK: da analyze - confused!
    425 ; CHECK: da analyze - output [* *]!
    426 
    427 for.cond1.preheader.preheader:                    ; preds = %entry
    428   br label %for.cond1.preheader
    429 
    430 for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
    431   %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
    432   %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
    433   %1 = add i32 %n, -1
    434   %2 = zext i32 %1 to i64
    435   %3 = add i64 %2, 1
    436   %cmp21 = icmp sgt i32 %n, 0
    437   br i1 %cmp21, label %for.body3.preheader, label %for.inc13
    438 
    439 for.body3.preheader:                              ; preds = %for.cond1.preheader
    440   br label %for.body3
    441 
    442 for.body3:                                        ; preds = %for.body3.preheader, %for.body3
    443   %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
    444   %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
    445   %4 = trunc i64 %indvars.iv to i32
    446   %mul = shl nsw i32 %4, 2
    447   %idxprom = sext i32 %mul to i64
    448   %5 = trunc i64 %indvars.iv8 to i32
    449   %mul4 = shl nsw i32 %5, 1
    450   %idxprom5 = sext i32 %mul4 to i64
    451   %6 = mul nsw i64 %idxprom5, %0
    452   %arrayidx.sum = add i64 %6, %idxprom
    453   %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
    454   %7 = trunc i64 %indvars.iv8 to i32
    455   store i32 %7, i32* %arrayidx6, align 4
    456   %8 = trunc i64 %indvars.iv to i32
    457   %mul7 = mul nsw i32 %8, 6
    458   %add7 = or i32 %mul7, 1
    459   %idxprom8 = sext i32 %add7 to i64
    460   %9 = trunc i64 %indvars.iv8 to i32
    461   %mul9 = shl nsw i32 %9, 3
    462   %idxprom10 = sext i32 %mul9 to i64
    463   %10 = mul nsw i64 %idxprom10, %0
    464   %arrayidx11.sum = add i64 %10, %idxprom8
    465   %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
    466   %11 = load i32* %arrayidx12, align 4
    467   %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
    468   store i32 %11, i32* %B.addr.12, align 4
    469   %indvars.iv.next = add i64 %indvars.iv, 1
    470   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    471   %exitcond = icmp ne i32 %lftr.wideiv, %n
    472   br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
    473 
    474 for.inc13.loopexit:                               ; preds = %for.body3
    475   %scevgep = getelementptr i32* %B.addr.05, i64 %3
    476   br label %for.inc13
    477 
    478 for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
    479   %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
    480   %indvars.iv.next9 = add i64 %indvars.iv8, 1
    481   %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
    482   %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
    483   br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
    484 
    485 for.end15.loopexit:                               ; preds = %for.inc13
    486   br label %for.end15
    487 
    488 for.end15:                                        ; preds = %for.end15.loopexit, %entry
    489   ret void
    490 }
    491 
    492 
    493 ;;  for (int i = 0; i < n; i++)
    494 ;;    for (int j = 0; j < n; j++) {
    495 ;;      A[n*2*i + 4*j] = i;
    496 ;;      *B++ = A[n*8*i + 6*j + 1];
    497 
    498 define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
    499 entry:
    500   %cmp4 = icmp sgt i32 %n, 0
    501   br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
    502 
    503 ; CHECK: da analyze - output [* *]!
    504 ; CHECK: da analyze - none!
    505 ; CHECK: da analyze - confused!
    506 ; CHECK: da analyze - input [* *]!
    507 ; CHECK: da analyze - confused!
    508 ; CHECK: da analyze - output [* *]!
    509 
    510 for.cond1.preheader.preheader:                    ; preds = %entry
    511   br label %for.cond1.preheader
    512 
    513 for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
    514   %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
    515   %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
    516   %0 = add i32 %n, -1
    517   %1 = zext i32 %0 to i64
    518   %2 = add i64 %1, 1
    519   %cmp21 = icmp sgt i32 %n, 0
    520   br i1 %cmp21, label %for.body3.preheader, label %for.inc13
    521 
    522 for.body3.preheader:                              ; preds = %for.cond1.preheader
    523   br label %for.body3
    524 
    525 for.body3:                                        ; preds = %for.body3.preheader, %for.body3
    526   %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
    527   %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
    528   %mul = shl nsw i32 %n, 1
    529   %mul4 = mul nsw i32 %mul, %i.06
    530   %3 = trunc i64 %indvars.iv to i32
    531   %mul5 = shl nsw i32 %3, 2
    532   %add = add nsw i32 %mul4, %mul5
    533   %idxprom = sext i32 %add to i64
    534   %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom
    535   store i32 %i.06, i32* %arrayidx, align 4
    536   %mul6 = shl nsw i32 %n, 3
    537   %mul7 = mul nsw i32 %mul6, %i.06
    538   %4 = trunc i64 %indvars.iv to i32
    539   %mul8 = mul nsw i32 %4, 6
    540   %add9 = add nsw i32 %mul7, %mul8
    541   %add10 = or i32 %add9, 1
    542   %idxprom11 = sext i32 %add10 to i64
    543   %arrayidx12 = getelementptr inbounds i32* %A, i64 %idxprom11
    544   %5 = load i32* %arrayidx12, align 4
    545   %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
    546   store i32 %5, i32* %B.addr.12, align 4
    547   %indvars.iv.next = add i64 %indvars.iv, 1
    548   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    549   %exitcond = icmp ne i32 %lftr.wideiv, %n
    550   br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
    551 
    552 for.inc13.loopexit:                               ; preds = %for.body3
    553   %scevgep = getelementptr i32* %B.addr.05, i64 %2
    554   br label %for.inc13
    555 
    556 for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
    557   %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
    558   %inc14 = add nsw i32 %i.06, 1
    559   %exitcond7 = icmp ne i32 %inc14, %n
    560   br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
    561 
    562 for.end15.loopexit:                               ; preds = %for.inc13
    563   br label %for.end15
    564 
    565 for.end15:                                        ; preds = %for.end15.loopexit, %entry
    566   ret void
    567 }
    568 
    569 
    570 ;;  for (unsigned i = 0; i < n; i++)
    571 ;;    for (unsigned j = 0; j < n; j++) {
    572 ;;      A[2*i][4*j] = i;
    573 ;;      *B++ = A[8*i][6*j + 1];
    574 
    575 define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
    576 entry:
    577   %0 = zext i32 %n to i64
    578   %cmp4 = icmp eq i32 %n, 0
    579   br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
    580 
    581 ; CHECK: da analyze - output [* *]!
    582 ; CHECK: da analyze - flow [* *|<]!
    583 ; CHECK: da analyze - confused!
    584 ; CHECK: da analyze - input [* *]!
    585 ; CHECK: da analyze - confused!
    586 ; CHECK: da analyze - output [* *]!
    587 
    588 for.cond1.preheader.preheader:                    ; preds = %entry
    589   br label %for.cond1.preheader
    590 
    591 for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
    592   %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
    593   %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
    594   %1 = add i32 %n, -1
    595   %2 = zext i32 %1 to i64
    596   %3 = add i64 %2, 1
    597   %cmp21 = icmp eq i32 %n, 0
    598   br i1 %cmp21, label %for.inc13, label %for.body3.preheader
    599 
    600 for.body3.preheader:                              ; preds = %for.cond1.preheader
    601   br label %for.body3
    602 
    603 for.body3:                                        ; preds = %for.body3.preheader, %for.body3
    604   %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
    605   %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
    606   %4 = trunc i64 %indvars.iv to i32
    607   %mul = shl i32 %4, 2
    608   %idxprom = zext i32 %mul to i64
    609   %5 = trunc i64 %indvars.iv8 to i32
    610   %mul4 = shl i32 %5, 1
    611   %idxprom5 = zext i32 %mul4 to i64
    612   %6 = mul nsw i64 %idxprom5, %0
    613   %arrayidx.sum = add i64 %6, %idxprom
    614   %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
    615   %7 = trunc i64 %indvars.iv8 to i32
    616   store i32 %7, i32* %arrayidx6, align 4
    617   %8 = trunc i64 %indvars.iv to i32
    618   %mul7 = mul i32 %8, 6
    619   %add7 = or i32 %mul7, 1
    620   %idxprom8 = zext i32 %add7 to i64
    621   %9 = trunc i64 %indvars.iv8 to i32
    622   %mul9 = shl i32 %9, 3
    623   %idxprom10 = zext i32 %mul9 to i64
    624   %10 = mul nsw i64 %idxprom10, %0
    625   %arrayidx11.sum = add i64 %10, %idxprom8
    626   %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
    627   %11 = load i32* %arrayidx12, align 4
    628   %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
    629   store i32 %11, i32* %B.addr.12, align 4
    630   %indvars.iv.next = add i64 %indvars.iv, 1
    631   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    632   %exitcond = icmp ne i32 %lftr.wideiv, %n
    633   br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
    634 
    635 for.inc13.loopexit:                               ; preds = %for.body3
    636   %scevgep = getelementptr i32* %B.addr.05, i64 %3
    637   br label %for.inc13
    638 
    639 for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
    640   %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
    641   %indvars.iv.next9 = add i64 %indvars.iv8, 1
    642   %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
    643   %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
    644   br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
    645 
    646 for.end15.loopexit:                               ; preds = %for.inc13
    647   br label %for.end15
    648 
    649 for.end15:                                        ; preds = %for.end15.loopexit, %entry
    650   ret void
    651 }
    652