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