Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
      2 
      3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      4 target triple = "x86_64-apple-macosx10.6.0"
      5 
      6 
      7 ;;  for (long int i = 0; i < n; i++) {
      8 ;;    A[2*i + n] = i;
      9 ;;    *B++ = A[3*i + 3*n];
     10 
     11 define void @symbolicsiv0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
     12 entry:
     13   %cmp1 = icmp eq i64 %n, 0
     14   br i1 %cmp1, label %for.end, label %for.body.preheader
     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.preheader:                               ; preds = %entry
     24   br label %for.body
     25 
     26 for.body:                                         ; preds = %for.body.preheader, %for.body
     27   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
     28   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
     29   %conv = trunc i64 %i.03 to i32
     30   %mul = shl nsw i64 %i.03, 1
     31   %add = add i64 %mul, %n
     32   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
     33   store i32 %conv, i32* %arrayidx, align 4
     34   %mul14 = add i64 %i.03, %n
     35   %add3 = mul i64 %mul14, 3
     36   %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %add3
     37   %0 = load i32, i32* %arrayidx4, align 4
     38   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
     39   store i32 %0, i32* %B.addr.02, align 4
     40   %inc = add nsw i64 %i.03, 1
     41   %exitcond = icmp ne i64 %inc, %n
     42   br i1 %exitcond, label %for.body, label %for.end.loopexit
     43 
     44 for.end.loopexit:                                 ; preds = %for.body
     45   br label %for.end
     46 
     47 for.end:                                          ; preds = %for.end.loopexit, %entry
     48   ret void
     49 }
     50 
     51 
     52 ;;  for (long int i = 0; i < n; i++) {
     53 ;;    A[2*i + 5*n] = i;
     54 ;;    *B++ = A[3*i + 2*n];
     55 
     56 define void @symbolicsiv1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
     57 entry:
     58   %cmp1 = icmp eq i64 %n, 0
     59   br i1 %cmp1, label %for.end, label %for.body.preheader
     60 
     61 ; CHECK: da analyze - none!
     62 ; CHECK: da analyze - none!
     63 ; CHECK: da analyze - confused!
     64 ; CHECK: da analyze - none!
     65 ; CHECK: da analyze - confused!
     66 ; CHECK: da analyze - none!
     67 
     68 for.body.preheader:                               ; preds = %entry
     69   br label %for.body
     70 
     71 for.body:                                         ; preds = %for.body.preheader, %for.body
     72   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
     73   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
     74   %conv = trunc i64 %i.03 to i32
     75   %mul = shl nsw i64 %i.03, 1
     76   %mul1 = mul i64 %n, 5
     77   %add = add i64 %mul, %mul1
     78   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
     79   store i32 %conv, i32* %arrayidx, align 4
     80   %mul2 = mul nsw i64 %i.03, 3
     81   %mul3 = shl i64 %n, 1
     82   %add4 = add i64 %mul2, %mul3
     83   %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %add4
     84   %0 = load i32, i32* %arrayidx5, align 4
     85   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
     86   store i32 %0, i32* %B.addr.02, align 4
     87   %inc = add nsw i64 %i.03, 1
     88   %exitcond = icmp ne i64 %inc, %n
     89   br i1 %exitcond, label %for.body, label %for.end.loopexit
     90 
     91 for.end.loopexit:                                 ; preds = %for.body
     92   br label %for.end
     93 
     94 for.end:                                          ; preds = %for.end.loopexit, %entry
     95   ret void
     96 }
     97 
     98 
     99 ;;  for (long int i = 0; i < n; i++) {
    100 ;;    A[2*i - n] = i;
    101 ;;    *B++ = A[-i + 2*n];
    102 
    103 define void @symbolicsiv2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    104 entry:
    105   %cmp1 = icmp eq i64 %n, 0
    106   br i1 %cmp1, label %for.end, label %for.body.preheader
    107 
    108 ; CHECK: da analyze - none!
    109 ; CHECK: da analyze - none!
    110 ; CHECK: da analyze - confused!
    111 ; CHECK: da analyze - none!
    112 ; CHECK: da analyze - confused!
    113 ; CHECK: da analyze - none!
    114 
    115 for.body.preheader:                               ; preds = %entry
    116   br label %for.body
    117 
    118 for.body:                                         ; preds = %for.body.preheader, %for.body
    119   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    120   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    121   %conv = trunc i64 %i.03 to i32
    122   %mul = shl nsw i64 %i.03, 1
    123   %sub = sub i64 %mul, %n
    124   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
    125   store i32 %conv, i32* %arrayidx, align 4
    126   %mul2 = shl i64 %n, 1
    127   %add = sub i64 %mul2, %i.03
    128   %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add
    129   %0 = load i32, i32* %arrayidx3, align 4
    130   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    131   store i32 %0, i32* %B.addr.02, align 4
    132   %inc = add nsw i64 %i.03, 1
    133   %exitcond = icmp ne i64 %inc, %n
    134   br i1 %exitcond, label %for.body, label %for.end.loopexit
    135 
    136 for.end.loopexit:                                 ; preds = %for.body
    137   br label %for.end
    138 
    139 for.end:                                          ; preds = %for.end.loopexit, %entry
    140   ret void
    141 }
    142 
    143 
    144 ;;  for (long int i = 0; i < n; i++) {
    145 ;;    A[-2*i + n + 1] = i;
    146 ;;    *B++ = A[i - 2*n];
    147 
    148 define void @symbolicsiv3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    149 entry:
    150   %cmp1 = icmp eq i64 %n, 0
    151   br i1 %cmp1, label %for.end, label %for.body.preheader
    152 
    153 ; CHECK: da analyze - none!
    154 ; CHECK: da analyze - none!
    155 ; CHECK: da analyze - confused!
    156 ; CHECK: da analyze - none!
    157 ; CHECK: da analyze - confused!
    158 ; CHECK: da analyze - none!
    159 
    160 for.body.preheader:                               ; preds = %entry
    161   br label %for.body
    162 
    163 for.body:                                         ; preds = %for.body.preheader, %for.body
    164   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    165   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    166   %conv = trunc i64 %i.03 to i32
    167   %mul = mul nsw i64 %i.03, -2
    168   %add = add i64 %mul, %n
    169   %add1 = add i64 %add, 1
    170   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add1
    171   store i32 %conv, i32* %arrayidx, align 4
    172   %mul2 = shl i64 %n, 1
    173   %sub = sub i64 %i.03, %mul2
    174   %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %sub
    175   %0 = load i32, i32* %arrayidx3, align 4
    176   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    177   store i32 %0, i32* %B.addr.02, align 4
    178   %inc = add nsw i64 %i.03, 1
    179   %exitcond = icmp ne i64 %inc, %n
    180   br i1 %exitcond, label %for.body, label %for.end.loopexit
    181 
    182 for.end.loopexit:                                 ; preds = %for.body
    183   br label %for.end
    184 
    185 for.end:                                          ; preds = %for.end.loopexit, %entry
    186   ret void
    187 }
    188 
    189 
    190 ;;  for (long int i = 0; i < n; i++) {
    191 ;;    A[-2*i + 3*n] = i;
    192 ;;    *B++ = A[-i + n];
    193 
    194 define void @symbolicsiv4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    195 entry:
    196   %cmp1 = icmp eq i64 %n, 0
    197   br i1 %cmp1, label %for.end, label %for.body.preheader
    198 
    199 ; CHECK: da analyze - none!
    200 ; CHECK: da analyze - none!
    201 ; CHECK: da analyze - confused!
    202 ; CHECK: da analyze - none!
    203 ; CHECK: da analyze - confused!
    204 ; CHECK: da analyze - none!
    205 
    206 for.body.preheader:                               ; preds = %entry
    207   br label %for.body
    208 
    209 for.body:                                         ; preds = %for.body.preheader, %for.body
    210   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    211   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    212   %conv = trunc i64 %i.03 to i32
    213   %mul = mul nsw i64 %i.03, -2
    214   %mul1 = mul i64 %n, 3
    215   %add = add i64 %mul, %mul1
    216   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
    217   store i32 %conv, i32* %arrayidx, align 4
    218   %add2 = sub i64 %n, %i.03
    219   %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add2
    220   %0 = load i32, i32* %arrayidx3, align 4
    221   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    222   store i32 %0, i32* %B.addr.02, align 4
    223   %inc = add nsw i64 %i.03, 1
    224   %exitcond = icmp ne i64 %inc, %n
    225   br i1 %exitcond, label %for.body, label %for.end.loopexit
    226 
    227 for.end.loopexit:                                 ; preds = %for.body
    228   br label %for.end
    229 
    230 for.end:                                          ; preds = %for.end.loopexit, %entry
    231   ret void
    232 }
    233 
    234 
    235 ;;  for (long int i = 0; i < n; i++) {
    236 ;;    A[-2*i - 2*n] = i;
    237 ;;    *B++ = A[-i - n];
    238 
    239 define void @symbolicsiv5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    240 entry:
    241   %cmp1 = icmp eq i64 %n, 0
    242   br i1 %cmp1, label %for.end, label %for.body.preheader
    243 
    244 ; CHECK: da analyze - none!
    245 ; CHECK: da analyze - none!
    246 ; CHECK: da analyze - confused!
    247 ; CHECK: da analyze - none!
    248 ; CHECK: da analyze - confused!
    249 ; CHECK: da analyze - none!
    250 
    251 for.body.preheader:                               ; preds = %entry
    252   br label %for.body
    253 
    254 for.body:                                         ; preds = %for.body.preheader, %for.body
    255   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    256   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    257   %conv = trunc i64 %i.03 to i32
    258   %mul = mul nsw i64 %i.03, -2
    259   %mul1 = shl i64 %n, 1
    260   %sub = sub i64 %mul, %mul1
    261   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
    262   store i32 %conv, i32* %arrayidx, align 4
    263   %sub2 = sub nsw i64 0, %i.03
    264   %sub3 = sub i64 %sub2, %n
    265   %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %sub3
    266   %0 = load i32, i32* %arrayidx4, align 4
    267   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    268   store i32 %0, i32* %B.addr.02, align 4
    269   %inc = add nsw i64 %i.03, 1
    270   %exitcond = icmp ne i64 %inc, %n
    271   br i1 %exitcond, label %for.body, label %for.end.loopexit
    272 
    273 for.end.loopexit:                                 ; preds = %for.body
    274   br label %for.end
    275 
    276 for.end:                                          ; preds = %for.end.loopexit, %entry
    277   ret void
    278 }
    279 
    280 
    281 ;; why doesn't SCEV package understand that n >= 0?
    282 ;;  for (long unsigned i = 0; i < n; i++) {
    283 ;;    A[i + n + 1] = i;
    284 ;;    *B++ = A[-i];
    285 
    286 define void @weaktest(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    287 entry:
    288   %cmp1 = icmp eq i64 %n, 0
    289   br i1 %cmp1, label %for.end, label %for.body.preheader
    290 
    291 ; CHECK: da analyze - none!
    292 ; CHECK: da analyze - flow [*|<] splitable!
    293 ; CHECK: da analyze - split level = 1, iteration = ((0 smax (-4 + (-4 * %n))) /u 8)!
    294 ; CHECK: da analyze - confused!
    295 ; CHECK: da analyze - none!
    296 ; CHECK: da analyze - confused!
    297 ; CHECK: da analyze - none!
    298 
    299 for.body.preheader:                               ; preds = %entry
    300   br label %for.body
    301 
    302 for.body:                                         ; preds = %for.body.preheader, %for.body
    303   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    304   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    305   %conv = trunc i64 %i.03 to i32
    306   %add = add i64 %i.03, %n
    307   %add1 = add i64 %add, 1
    308   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add1
    309   store i32 %conv, i32* %arrayidx, align 4
    310   %sub = sub i64 0, %i.03
    311   %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
    312   %0 = load i32, i32* %arrayidx2, align 4
    313   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    314   store i32 %0, i32* %B.addr.02, align 4
    315   %inc = add i64 %i.03, 1
    316   %exitcond = icmp ne i64 %inc, %n
    317   br i1 %exitcond, label %for.body, label %for.end.loopexit
    318 
    319 for.end.loopexit:                                 ; preds = %for.body
    320   br label %for.end
    321 
    322 for.end:                                          ; preds = %for.end.loopexit, %entry
    323   ret void
    324 }
    325 
    326 
    327 ;;  for (long int i = 0; i < n; i++) {
    328 ;;    A[4*N*i + M] = i;
    329 ;;    *B++ = A[4*N*i + 3*M + 1];
    330 
    331 define void @symbolicsiv6(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
    332 entry:
    333   %cmp1 = icmp eq i64 %n, 0
    334   br i1 %cmp1, label %for.end, label %for.body.preheader
    335 
    336 ; CHECK-LABEL: symbolicsiv6
    337 ; CHECK: da analyze - none!
    338 ; CHECK: da analyze - none!
    339 ; CHECK: da analyze - confused!
    340 ; CHECK: da analyze - none!
    341 ; CHECK: da analyze - confused!
    342 ; CHECK: da analyze - none!
    343 
    344 for.body.preheader:                               ; preds = %entry
    345   br label %for.body
    346 
    347 for.body:                                         ; preds = %for.body.preheader, %for.body
    348   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    349   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    350   %conv = trunc i64 %i.03 to i32
    351   %mul = shl i64 %N, 2
    352   %mul1 = mul i64 %mul, %i.03
    353   %add = add i64 %mul1, %M
    354   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
    355   store i32 %conv, i32* %arrayidx, align 4
    356   %mul2 = shl i64 %N, 2
    357   %mul3 = mul i64 %mul2, %i.03
    358   %mul4 = mul i64 %M, 3
    359   %add5 = add i64 %mul3, %mul4
    360   %add6 = add i64 %add5, 1
    361   %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add6
    362   %0 = load i32, i32* %arrayidx7, align 4
    363   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    364   store i32 %0, i32* %B.addr.02, align 4
    365   %inc = add nsw i64 %i.03, 1
    366   %exitcond = icmp ne i64 %inc, %n
    367   br i1 %exitcond, label %for.body, label %for.end.loopexit
    368 
    369 for.end.loopexit:                                 ; preds = %for.body
    370   br label %for.end
    371 
    372 for.end:                                          ; preds = %for.end.loopexit, %entry
    373   ret void
    374 }
    375 
    376 
    377 ;;  for (long int i = 0; i < n; i++) {
    378 ;;    A[2*N*i + M] = i;
    379 ;;    *B++ = A[2*N*i - 3*M + 2];
    380 
    381 define void @symbolicsiv7(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
    382 entry:
    383   %cmp1 = icmp eq i64 %n, 0
    384   br i1 %cmp1, label %for.end, label %for.body.preheader
    385 ; CHECK-LABEL: symbolicsiv7
    386 ; CHECK: da analyze - none!
    387 ; CHECK: da analyze - flow [<>]!
    388 ; CHECK: da analyze - confused!
    389 ; CHECK: da analyze - none!
    390 ; CHECK: da analyze - confused!
    391 ; CHECK: da analyze - none!
    392 
    393 for.body.preheader:                               ; preds = %entry
    394   br label %for.body
    395 
    396 for.body:                                         ; preds = %for.body.preheader, %for.body
    397   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    398   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    399   %conv = trunc i64 %i.03 to i32
    400   %mul = shl i64 %N, 1
    401   %mul1 = mul i64 %mul, %i.03
    402   %add = add i64 %mul1, %M
    403   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
    404   store i32 %conv, i32* %arrayidx, align 4
    405   %mul2 = shl i64 %N, 1
    406   %mul3 = mul i64 %mul2, %i.03
    407   %0 = mul i64 %M, -3
    408   %sub = add i64 %mul3, %0
    409   %add5 = add i64 %sub, 2
    410   %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %add5
    411   %1 = load i32, i32* %arrayidx6, align 4
    412   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    413   store i32 %1, i32* %B.addr.02, align 4
    414   %inc = add nsw i64 %i.03, 1
    415   %exitcond = icmp ne i64 %inc, %n
    416   br i1 %exitcond, label %for.body, label %for.end.loopexit
    417 
    418 for.end.loopexit:                                 ; preds = %for.body
    419   br label %for.end
    420 
    421 for.end:                                          ; preds = %for.end.loopexit, %entry
    422   ret void
    423 }
    424