Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
      2 
      3 ; ModuleID = 'Coupled.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 < 50; i++) {
      9 ;;    A[i][i] = i;
     10 ;;    *B++ = A[i + 10][i + 9];
     11 
     12 define void @couple0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
     13 entry:
     14   br label %for.body
     15 
     16 ; CHECK: da analyze - none!
     17 ; CHECK: da analyze - none!
     18 ; CHECK: da analyze - confused!
     19 ; CHECK: da analyze - none!
     20 ; CHECK: da analyze - confused!
     21 ; CHECK: da analyze - none!
     22 
     23 for.body:                                         ; preds = %entry, %for.body
     24   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
     25   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
     26   %conv = trunc i64 %i.02 to i32
     27   %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
     28   store i32 %conv, i32* %arrayidx1, align 4
     29   %add = add nsw i64 %i.02, 9
     30   %add2 = add nsw i64 %i.02, 10
     31   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add
     32   %0 = load i32, i32* %arrayidx4, align 4
     33   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
     34   store i32 %0, i32* %B.addr.01, align 4
     35   %inc = add nsw i64 %i.02, 1
     36   %exitcond = icmp ne i64 %inc, 50
     37   br i1 %exitcond, label %for.body, label %for.end
     38 
     39 for.end:                                          ; preds = %for.body
     40   ret void
     41 }
     42 
     43 
     44 ;;  for (long int i = 0; i < 50; i++) {
     45 ;;    A[i][i] = i;
     46 ;;    *B++ = A[i + 9][i + 9];
     47 
     48 define void @couple1([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
     49 entry:
     50   br label %for.body
     51 
     52 ; CHECK: da analyze - none!
     53 ; CHECK: da analyze - consistent flow [-9]!
     54 ; CHECK: da analyze - confused!
     55 ; CHECK: da analyze - none!
     56 ; CHECK: da analyze - confused!
     57 ; CHECK: da analyze - none!
     58 
     59 for.body:                                         ; preds = %entry, %for.body
     60   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
     61   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
     62   %conv = trunc i64 %i.02 to i32
     63   %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
     64   store i32 %conv, i32* %arrayidx1, align 4
     65   %add = add nsw i64 %i.02, 9
     66   %add2 = add nsw i64 %i.02, 9
     67   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add
     68   %0 = load i32, i32* %arrayidx4, align 4
     69   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
     70   store i32 %0, i32* %B.addr.01, align 4
     71   %inc = add nsw i64 %i.02, 1
     72   %exitcond = icmp ne i64 %inc, 50
     73   br i1 %exitcond, label %for.body, label %for.end
     74 
     75 for.end:                                          ; preds = %for.body
     76   ret void
     77 }
     78 
     79 
     80 ;;  for (long int i = 0; i < 50; i++) {
     81 ;;    A[3*i - 6][3*i - 6] = i;
     82 ;;    *B++ = A[i][i];
     83 
     84 define void @couple2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
     85 entry:
     86   br label %for.body
     87 
     88 ; CHECK: da analyze - none!
     89 ; CHECK: da analyze - flow [*|<]!
     90 ; CHECK: da analyze - confused!
     91 ; CHECK: da analyze - none!
     92 ; CHECK: da analyze - confused!
     93 ; CHECK: da analyze - none!
     94 
     95 for.body:                                         ; preds = %entry, %for.body
     96   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
     97   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
     98   %conv = trunc i64 %i.02 to i32
     99   %mul = mul nsw i64 %i.02, 3
    100   %sub = add nsw i64 %mul, -6
    101   %mul1 = mul nsw i64 %i.02, 3
    102   %sub2 = add nsw i64 %mul1, -6
    103   %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub
    104   store i32 %conv, i32* %arrayidx3, align 4
    105   %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    106   %0 = load i32, i32* %arrayidx5, align 4
    107   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    108   store i32 %0, i32* %B.addr.01, align 4
    109   %inc = add nsw i64 %i.02, 1
    110   %exitcond = icmp ne i64 %inc, 50
    111   br i1 %exitcond, label %for.body, label %for.end
    112 
    113 for.end:                                          ; preds = %for.body
    114   ret void
    115 }
    116 
    117 
    118 ;;  for (long int i = 0; i < 50; i++) {
    119 ;;    A[3*i - 6][3*i - 5] = i;
    120 ;;    *B++ = A[i][i];
    121 
    122 define void @couple3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    123 entry:
    124   br label %for.body
    125 
    126 ; CHECK: da analyze - none!
    127 ; CHECK: da analyze - none!
    128 ; CHECK: da analyze - confused!
    129 ; CHECK: da analyze - none!
    130 ; CHECK: da analyze - confused!
    131 ; CHECK: da analyze - none!
    132 
    133 for.body:                                         ; preds = %entry, %for.body
    134   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    135   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    136   %conv = trunc i64 %i.02 to i32
    137   %mul = mul nsw i64 %i.02, 3
    138   %sub = add nsw i64 %mul, -5
    139   %mul1 = mul nsw i64 %i.02, 3
    140   %sub2 = add nsw i64 %mul1, -6
    141   %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub
    142   store i32 %conv, i32* %arrayidx3, align 4
    143   %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    144   %0 = load i32, i32* %arrayidx5, align 4
    145   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    146   store i32 %0, i32* %B.addr.01, align 4
    147   %inc = add nsw i64 %i.02, 1
    148   %exitcond = icmp ne i64 %inc, 50
    149   br i1 %exitcond, label %for.body, label %for.end
    150 
    151 for.end:                                          ; preds = %for.body
    152   ret void
    153 }
    154 
    155 
    156 ;;  for (long int i = 0; i < 50; i++) {
    157 ;;    A[3*i - 6][3*i - n] = i;
    158 ;;    *B++ = A[i][i];
    159 
    160 define void @couple4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    161 entry:
    162   br label %for.body
    163 
    164 ; CHECK: da analyze - none!
    165 ; CHECK: da analyze - flow [*|<]!
    166 ; CHECK: da analyze - confused!
    167 ; CHECK: da analyze - none!
    168 ; CHECK: da analyze - confused!
    169 ; CHECK: da analyze - none!
    170 
    171 for.body:                                         ; preds = %entry, %for.body
    172   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    173   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    174   %conv = trunc i64 %i.02 to i32
    175   %mul = mul nsw i64 %i.02, 3
    176   %conv1 = sext i32 %n to i64
    177   %sub = sub nsw i64 %mul, %conv1
    178   %mul2 = mul nsw i64 %i.02, 3
    179   %sub3 = add nsw i64 %mul2, -6
    180   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub3, i64 %sub
    181   store i32 %conv, i32* %arrayidx4, align 4
    182   %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    183   %0 = load i32, i32* %arrayidx6, align 4
    184   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    185   store i32 %0, i32* %B.addr.01, align 4
    186   %inc = add nsw i64 %i.02, 1
    187   %exitcond = icmp ne i64 %inc, 50
    188   br i1 %exitcond, label %for.body, label %for.end
    189 
    190 for.end:                                          ; preds = %for.body
    191   ret void
    192 }
    193 
    194 
    195 ;;  for (long int i = 0; i < 50; i++) {
    196 ;;    A[3*i - n + 1][3*i - n] = i;
    197 ;;    *B++ = A[i][i];
    198 
    199 define void @couple5([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    200 entry:
    201   br label %for.body
    202 
    203 ; CHECK: da analyze - none!
    204 ; CHECK: da analyze - none!
    205 ; CHECK: da analyze - confused!
    206 ; CHECK: da analyze - none!
    207 ; CHECK: da analyze - confused!
    208 ; CHECK: da analyze - none!
    209 
    210 for.body:                                         ; preds = %entry, %for.body
    211   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    212   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    213   %conv = trunc i64 %i.02 to i32
    214   %mul = mul nsw i64 %i.02, 3
    215   %conv1 = sext i32 %n to i64
    216   %sub = sub nsw i64 %mul, %conv1
    217   %mul2 = mul nsw i64 %i.02, 3
    218   %conv3 = sext i32 %n to i64
    219   %sub4 = sub nsw i64 %mul2, %conv3
    220   %add = add nsw i64 %sub4, 1
    221   %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add, i64 %sub
    222   store i32 %conv, i32* %arrayidx5, align 4
    223   %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    224   %0 = load i32, i32* %arrayidx7, align 4
    225   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    226   store i32 %0, i32* %B.addr.01, align 4
    227   %inc = add nsw i64 %i.02, 1
    228   %exitcond = icmp ne i64 %inc, 50
    229   br i1 %exitcond, label %for.body, label %for.end
    230 
    231 for.end:                                          ; preds = %for.body
    232   ret void
    233 }
    234 
    235 
    236 ;;  for (long int i = 0; i < 50; i++) {
    237 ;;    A[i][3*i - 6] = i;
    238 ;;    *B++ = A[i][i];
    239 
    240 define void @couple6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    241 entry:
    242   br label %for.body
    243 
    244 ; CHECK: da analyze - none!
    245 ; CHECK: da analyze - flow [=|<]!
    246 ; CHECK: da analyze - confused!
    247 ; CHECK: da analyze - none!
    248 ; CHECK: da analyze - confused!
    249 ; CHECK: da analyze - none!
    250 
    251 for.body:                                         ; preds = %entry, %for.body
    252   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    253   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    254   %conv = trunc i64 %i.02 to i32
    255   %mul = mul nsw i64 %i.02, 3
    256   %sub = add nsw i64 %mul, -6
    257   %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub
    258   store i32 %conv, i32* %arrayidx1, align 4
    259   %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    260   %0 = load i32, i32* %arrayidx3, align 4
    261   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    262   store i32 %0, i32* %B.addr.01, align 4
    263   %inc = add nsw i64 %i.02, 1
    264   %exitcond = icmp ne i64 %inc, 50
    265   br i1 %exitcond, label %for.body, label %for.end
    266 
    267 for.end:                                          ; preds = %for.body
    268   ret void
    269 }
    270 
    271 
    272 ;;  for (long int i = 0; i < 50; i++) {
    273 ;;    A[i][3*i - 5] = i;
    274 ;;    *B++ = A[i][i];
    275 
    276 define void @couple7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    277 entry:
    278   br label %for.body
    279 
    280 ; CHECK: da analyze - none!
    281 ; CHECK: da analyze - none!
    282 ; CHECK: da analyze - confused!
    283 ; CHECK: da analyze - none!
    284 ; CHECK: da analyze - confused!
    285 ; CHECK: da analyze - none!
    286 
    287 for.body:                                         ; preds = %entry, %for.body
    288   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    289   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    290   %conv = trunc i64 %i.02 to i32
    291   %mul = mul nsw i64 %i.02, 3
    292   %sub = add nsw i64 %mul, -5
    293   %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub
    294   store i32 %conv, i32* %arrayidx1, align 4
    295   %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    296   %0 = load i32, i32* %arrayidx3, align 4
    297   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    298   store i32 %0, i32* %B.addr.01, align 4
    299   %inc = add nsw i64 %i.02, 1
    300   %exitcond = icmp ne i64 %inc, 50
    301   br i1 %exitcond, label %for.body, label %for.end
    302 
    303 for.end:                                          ; preds = %for.body
    304   ret void
    305 }
    306 
    307 
    308 ;;  for (long int i = 0; i <= 15; i++) {
    309 ;;    A[3*i - 18][3 - i] = i;
    310 ;;    *B++ = A[i][i];
    311 
    312 define void @couple8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    313 entry:
    314   br label %for.body
    315 
    316 ; CHECK: da analyze - none!
    317 ; CHECK: da analyze - none!
    318 ; CHECK: da analyze - confused!
    319 ; CHECK: da analyze - none!
    320 ; CHECK: da analyze - confused!
    321 ; CHECK: da analyze - none!
    322 
    323 for.body:                                         ; preds = %entry, %for.body
    324   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    325   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    326   %conv = trunc i64 %i.02 to i32
    327   %sub = sub nsw i64 3, %i.02
    328   %mul = mul nsw i64 %i.02, 3
    329   %sub1 = add nsw i64 %mul, -18
    330   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    331   store i32 %conv, i32* %arrayidx2, align 4
    332   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    333   %0 = load i32, i32* %arrayidx4, align 4
    334   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    335   store i32 %0, i32* %B.addr.01, align 4
    336   %inc = add nsw i64 %i.02, 1
    337   %exitcond = icmp ne i64 %inc, 16
    338   br i1 %exitcond, label %for.body, label %for.end
    339 
    340 for.end:                                          ; preds = %for.body
    341   ret void
    342 }
    343 
    344 
    345 ;;  for (long int i = 0; i <= 15; i++) {
    346 ;;    A[3*i - 18][2 - i] = i;
    347 ;;    *B++ = A[i][i];
    348 
    349 define void @couple9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    350 entry:
    351   br label %for.body
    352 
    353 ; CHECK: da analyze - none!
    354 ; CHECK: da analyze - none!
    355 ; CHECK: da analyze - confused!
    356 ; CHECK: da analyze - none!
    357 ; CHECK: da analyze - confused!
    358 ; CHECK: da analyze - none!
    359 
    360 for.body:                                         ; preds = %entry, %for.body
    361   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    362   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    363   %conv = trunc i64 %i.02 to i32
    364   %sub = sub nsw i64 2, %i.02
    365   %mul = mul nsw i64 %i.02, 3
    366   %sub1 = add nsw i64 %mul, -18
    367   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    368   store i32 %conv, i32* %arrayidx2, align 4
    369   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    370   %0 = load i32, i32* %arrayidx4, align 4
    371   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    372   store i32 %0, i32* %B.addr.01, align 4
    373   %inc = add nsw i64 %i.02, 1
    374   %exitcond = icmp ne i64 %inc, 16
    375   br i1 %exitcond, label %for.body, label %for.end
    376 
    377 for.end:                                          ; preds = %for.body
    378   ret void
    379 }
    380 
    381 
    382 ;;  for (long int i = 0; i <= 15; i++) {
    383 ;;    A[3*i - 18][6 - i] = i;
    384 ;;    *B++ = A[i][i];
    385 
    386 define void @couple10([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    387 entry:
    388   br label %for.body
    389 
    390 ; CHECK: da analyze - none!
    391 ; CHECK: da analyze - flow [>] splitable!
    392 ; CHECK: da analyze - split level = 1, iteration = 3!
    393 ; CHECK: da analyze - confused!
    394 ; CHECK: da analyze - none!
    395 ; CHECK: da analyze - confused!
    396 ; CHECK: da analyze - none!
    397 
    398 for.body:                                         ; preds = %entry, %for.body
    399   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    400   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    401   %conv = trunc i64 %i.02 to i32
    402   %sub = sub nsw i64 6, %i.02
    403   %mul = mul nsw i64 %i.02, 3
    404   %sub1 = add nsw i64 %mul, -18
    405   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    406   store i32 %conv, i32* %arrayidx2, align 4
    407   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    408   %0 = load i32, i32* %arrayidx4, align 4
    409   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    410   store i32 %0, i32* %B.addr.01, align 4
    411   %inc = add nsw i64 %i.02, 1
    412   %exitcond = icmp ne i64 %inc, 16
    413   br i1 %exitcond, label %for.body, label %for.end
    414 
    415 for.end:                                          ; preds = %for.body
    416   ret void
    417 }
    418 
    419 
    420 ;;  for (long int i = 0; i <= 15; i++) {
    421 ;;    A[3*i - 18][18 - i] = i;
    422 ;;    *B++ = A[i][i];
    423 
    424 define void @couple11([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    425 entry:
    426   br label %for.body
    427 
    428 ; CHECK: da analyze - none!
    429 ; CHECK: da analyze - flow [=|<] splitable!
    430 ; CHECK: da analyze - split level = 1, iteration = 9!
    431 ; CHECK: da analyze - confused!
    432 ; CHECK: da analyze - none!
    433 ; CHECK: da analyze - confused!
    434 ; CHECK: da analyze - none!
    435 
    436 for.body:                                         ; preds = %entry, %for.body
    437   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    438   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    439   %conv = trunc i64 %i.02 to i32
    440   %sub = sub nsw i64 18, %i.02
    441   %mul = mul nsw i64 %i.02, 3
    442   %sub1 = add nsw i64 %mul, -18
    443   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    444   store i32 %conv, i32* %arrayidx2, align 4
    445   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    446   %0 = load i32, i32* %arrayidx4, align 4
    447   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    448   store i32 %0, i32* %B.addr.01, align 4
    449   %inc = add nsw i64 %i.02, 1
    450   %exitcond = icmp ne i64 %inc, 16
    451   br i1 %exitcond, label %for.body, label %for.end
    452 
    453 for.end:                                          ; preds = %for.body
    454   ret void
    455 }
    456 
    457 
    458 ;;  for (long int i = 0; i <= 12; i++) {
    459 ;;    A[3*i - 18][22 - i] = i;
    460 ;;    *B++ = A[i][i];
    461 
    462 define void @couple12([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    463 entry:
    464   br label %for.body
    465 
    466 ; CHECK: da analyze - none!
    467 ; CHECK: da analyze - flow [<] splitable!
    468 ; CHECK: da analyze - split level = 1, iteration = 11!
    469 ; CHECK: da analyze - confused!
    470 ; CHECK: da analyze - none!
    471 ; CHECK: da analyze - confused!
    472 ; CHECK: da analyze - none!
    473 
    474 for.body:                                         ; preds = %entry, %for.body
    475   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    476   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    477   %conv = trunc i64 %i.02 to i32
    478   %sub = sub nsw i64 22, %i.02
    479   %mul = mul nsw i64 %i.02, 3
    480   %sub1 = add nsw i64 %mul, -18
    481   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    482   store i32 %conv, i32* %arrayidx2, align 4
    483   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    484   %0 = load i32, i32* %arrayidx4, align 4
    485   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    486   store i32 %0, i32* %B.addr.01, align 4
    487   %inc = add nsw i64 %i.02, 1
    488   %exitcond = icmp ne i64 %inc, 13
    489   br i1 %exitcond, label %for.body, label %for.end
    490 
    491 for.end:                                          ; preds = %for.body
    492   ret void
    493 }
    494 
    495 
    496 ;;  for (long int i = 0; i < 12; i++) {
    497 ;;    A[3*i - 18][22 - i] = i;
    498 ;;    *B++ = A[i][i];
    499 
    500 define void @couple13([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    501 entry:
    502   br label %for.body
    503 
    504 ; CHECK: da analyze - none!
    505 ; CHECK: da analyze - none!
    506 ; CHECK: da analyze - confused!
    507 ; CHECK: da analyze - none!
    508 ; CHECK: da analyze - confused!
    509 ; CHECK: da analyze - none!
    510 
    511 for.body:                                         ; preds = %entry, %for.body
    512   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    513   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    514   %conv = trunc i64 %i.02 to i32
    515   %sub = sub nsw i64 22, %i.02
    516   %mul = mul nsw i64 %i.02, 3
    517   %sub1 = add nsw i64 %mul, -18
    518   %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
    519   store i32 %conv, i32* %arrayidx2, align 4
    520   %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
    521   %0 = load i32, i32* %arrayidx4, align 4
    522   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    523   store i32 %0, i32* %B.addr.01, align 4
    524   %inc = add nsw i64 %i.02, 1
    525   %exitcond = icmp ne i64 %inc, 12
    526   br i1 %exitcond, label %for.body, label %for.end
    527 
    528 for.end:                                          ; preds = %for.body
    529   ret void
    530 }
    531 
    532 ;;  for (long int i = 0; i < 100; i++) {
    533 ;;    A[3*i - 18][18 - i][i] = i;
    534 ;;    *B++ = A[i][i][i];
    535 
    536 define void @couple14([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    537 entry:
    538   br label %for.body
    539 
    540 ; CHECK: da analyze - none!
    541 ; CHECK: da analyze - flow [=|<] splitable!
    542 ; CHECK: da analyze - split level = 1, iteration = 9!
    543 ; CHECK: da analyze - confused!
    544 ; CHECK: da analyze - none!
    545 ; CHECK: da analyze - confused!
    546 ; CHECK: da analyze - none!
    547 
    548 for.body:                                         ; preds = %entry, %for.body
    549   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    550   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    551   %conv = trunc i64 %i.02 to i32
    552   %sub = sub nsw i64 18, %i.02
    553   %mul = mul nsw i64 %i.02, 3
    554   %sub1 = add nsw i64 %mul, -18
    555   %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02
    556   store i32 %conv, i32* %arrayidx3, align 4
    557   %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02
    558   %0 = load i32, i32* %arrayidx6, align 4
    559   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    560   store i32 %0, i32* %B.addr.01, align 4
    561   %inc = add nsw i64 %i.02, 1
    562   %exitcond = icmp ne i64 %inc, 100
    563   br i1 %exitcond, label %for.body, label %for.end
    564 
    565 for.end:                                          ; preds = %for.body
    566   ret void
    567 }
    568 
    569 
    570 ;;  for (long int i = 0; i < 100; i++) {
    571 ;;    A[3*i - 18][22 - i][i] = i;
    572 ;;    *B++ = A[i][i][i];
    573 
    574 define void @couple15([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
    575 entry:
    576   br label %for.body
    577 
    578 ; CHECK: da analyze - none!
    579 ; CHECK: da analyze - none!
    580 ; CHECK: da analyze - confused!
    581 ; CHECK: da analyze - none!
    582 ; CHECK: da analyze - confused!
    583 ; CHECK: da analyze - none!
    584 
    585 for.body:                                         ; preds = %entry, %for.body
    586   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    587   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    588   %conv = trunc i64 %i.02 to i32
    589   %sub = sub nsw i64 22, %i.02
    590   %mul = mul nsw i64 %i.02, 3
    591   %sub1 = add nsw i64 %mul, -18
    592   %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02
    593   store i32 %conv, i32* %arrayidx3, align 4
    594   %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02
    595   %0 = load i32, i32* %arrayidx6, align 4
    596   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    597   store i32 %0, i32* %B.addr.01, align 4
    598   %inc = add nsw i64 %i.02, 1
    599   %exitcond = icmp ne i64 %inc, 100
    600   br i1 %exitcond, label %for.body, label %for.end
    601 
    602 for.end:                                          ; preds = %for.body
    603   ret void
    604 }
    605