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