Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
      2 
      3 ; ModuleID = 'WeakCrossingSIV.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 unsigned i = 0; i < n; i++) {
      9 ;;    A[1 + n*i] = i;
     10 ;;    *B++ = A[1 - n*i];
     11 
     12 define void @weakcrossing0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
     13 entry:
     14   %cmp1 = icmp eq i64 %n, 0
     15   br i1 %cmp1, label %for.end, label %for.body.preheader
     16 
     17 for.body.preheader:                               ; preds = %entry
     18   br label %for.body
     19 
     20 ; CHECK: da analyze - none!
     21 ; CHECK: da analyze - flow [0|<]!
     22 ; CHECK: da analyze - confused!
     23 ; CHECK: da analyze - none!
     24 ; CHECK: da analyze - confused!
     25 ; CHECK: da analyze - none!
     26 
     27 for.body:                                         ; preds = %for.body.preheader, %for.body
     28   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
     29   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
     30   %conv = trunc i64 %i.03 to i32
     31   %mul = mul i64 %i.03, %n
     32   %add = add i64 %mul, 1
     33   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
     34   store i32 %conv, i32* %arrayidx, align 4
     35   %mul1 = mul i64 %i.03, %n
     36   %sub = sub i64 1, %mul1
     37   %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
     38   %0 = load i32, i32* %arrayidx2, align 4
     39   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
     40   store i32 %0, i32* %B.addr.02, align 4
     41   %inc = add i64 %i.03, 1
     42   %exitcond = icmp ne i64 %inc, %n
     43   br i1 %exitcond, label %for.body, label %for.end.loopexit
     44 
     45 for.end.loopexit:                                 ; preds = %for.body
     46   br label %for.end
     47 
     48 for.end:                                          ; preds = %for.end.loopexit, %entry
     49   ret void
     50 }
     51 
     52 
     53 ;;  for (long unsigned i = 0; i < n; i++) {
     54 ;;    A[n + i] = i;
     55 ;;    *B++ = A[1 + n - i];
     56 
     57 define void @weakcrossing1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
     58 entry:
     59   %cmp1 = icmp eq i64 %n, 0
     60   br i1 %cmp1, label %for.end, label %for.body.preheader
     61 
     62 ; CHECK: da analyze - none!
     63 ; CHECK: da analyze - flow [<>] splitable!
     64 ; CHECK: da analyze - split level = 1, iteration = 0!
     65 ; CHECK: da analyze - confused!
     66 ; CHECK: da analyze - none!
     67 ; CHECK: da analyze - confused!
     68 ; CHECK: da analyze - none!
     69 
     70 for.body.preheader:                               ; preds = %entry
     71   br label %for.body
     72 
     73 for.body:                                         ; preds = %for.body.preheader, %for.body
     74   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
     75   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
     76   %conv = trunc i64 %i.03 to i32
     77   %add = add i64 %i.03, %n
     78   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
     79   store i32 %conv, i32* %arrayidx, align 4
     80   %add1 = add i64 %n, 1
     81   %sub = sub i64 %add1, %i.03
     82   %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
     83   %0 = load i32, i32* %arrayidx2, align 4
     84   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
     85   store i32 %0, i32* %B.addr.02, align 4
     86   %inc = add i64 %i.03, 1
     87   %exitcond = icmp ne i64 %inc, %n
     88   br i1 %exitcond, label %for.body, label %for.end.loopexit
     89 
     90 for.end.loopexit:                                 ; preds = %for.body
     91   br label %for.end
     92 
     93 for.end:                                          ; preds = %for.end.loopexit, %entry
     94   ret void
     95 }
     96 
     97 
     98 ;;  for (long unsigned i = 0; i < 3; i++) {
     99 ;;    A[i] = i;
    100 ;;    *B++ = A[6 - i];
    101 
    102 define void @weakcrossing2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    103 entry:
    104   br label %for.body
    105 
    106 ; CHECK: da analyze - none!
    107 ; CHECK: da analyze - none!
    108 ; CHECK: da analyze - confused!
    109 ; CHECK: da analyze - none!
    110 ; CHECK: da analyze - confused!
    111 ; CHECK: da analyze - none!
    112 
    113 for.body:                                         ; preds = %entry, %for.body
    114   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    115   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    116   %conv = trunc i64 %i.02 to i32
    117   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
    118   store i32 %conv, i32* %arrayidx, align 4
    119   %sub = sub i64 6, %i.02
    120   %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
    121   %0 = load i32, i32* %arrayidx1, align 4
    122   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    123   store i32 %0, i32* %B.addr.01, align 4
    124   %inc = add i64 %i.02, 1
    125   %exitcond = icmp ne i64 %inc, 3
    126   br i1 %exitcond, label %for.body, label %for.end
    127 
    128 for.end:                                          ; preds = %for.body
    129   ret void
    130 }
    131 
    132 
    133 ;;  for (long unsigned i = 0; i < 4; i++) {
    134 ;;    A[i] = i;
    135 ;;    *B++ = A[6 - i];
    136 
    137 define void @weakcrossing3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    138 entry:
    139   br label %for.body
    140 
    141 ; CHECK: da analyze - none!
    142 ; CHECK: da analyze - flow [0|<]!
    143 ; CHECK: da analyze - confused!
    144 ; CHECK: da analyze - none!
    145 ; CHECK: da analyze - confused!
    146 ; CHECK: da analyze - none!
    147 
    148 for.body:                                         ; preds = %entry, %for.body
    149   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    150   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    151   %conv = trunc i64 %i.02 to i32
    152   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
    153   store i32 %conv, i32* %arrayidx, align 4
    154   %sub = sub i64 6, %i.02
    155   %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
    156   %0 = load i32, i32* %arrayidx1, align 4
    157   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    158   store i32 %0, i32* %B.addr.01, align 4
    159   %inc = add i64 %i.02, 1
    160   %exitcond = icmp ne i64 %inc, 4
    161   br i1 %exitcond, label %for.body, label %for.end
    162 
    163 for.end:                                          ; preds = %for.body
    164   ret void
    165 }
    166 
    167 
    168 ;;  for (long unsigned i = 0; i < 10; i++) {
    169 ;;    A[i] = i;
    170 ;;    *B++ = A[-6 - i];
    171 
    172 define void @weakcrossing4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    173 entry:
    174   br label %for.body
    175 
    176 ; CHECK: da analyze - none!
    177 ; CHECK: da analyze - none!
    178 ; CHECK: da analyze - confused!
    179 ; CHECK: da analyze - none!
    180 ; CHECK: da analyze - confused!
    181 ; CHECK: da analyze - none!
    182 
    183 for.body:                                         ; preds = %entry, %for.body
    184   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
    185   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
    186   %conv = trunc i64 %i.02 to i32
    187   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
    188   store i32 %conv, i32* %arrayidx, align 4
    189   %sub = sub i64 -6, %i.02
    190   %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
    191   %0 = load i32, i32* %arrayidx1, align 4
    192   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    193   store i32 %0, i32* %B.addr.01, align 4
    194   %inc = add i64 %i.02, 1
    195   %exitcond = icmp ne i64 %inc, 10
    196   br i1 %exitcond, label %for.body, label %for.end
    197 
    198 for.end:                                          ; preds = %for.body
    199   ret void
    200 }
    201 
    202 
    203 ;;  for (long unsigned i = 0; i < n; i++) {
    204 ;;    A[3*i] = i;
    205 ;;    *B++ = A[5 - 3*i];
    206 
    207 define void @weakcrossing5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    208 entry:
    209   %cmp1 = icmp eq i64 %n, 0
    210   br i1 %cmp1, label %for.end, label %for.body.preheader
    211 
    212 ; CHECK: da analyze - none!
    213 ; CHECK: da analyze - none!
    214 ; CHECK: da analyze - confused!
    215 ; CHECK: da analyze - none!
    216 ; CHECK: da analyze - confused!
    217 ; CHECK: da analyze - none!
    218 
    219 for.body.preheader:                               ; preds = %entry
    220   br label %for.body
    221 
    222 for.body:                                         ; preds = %for.body.preheader, %for.body
    223   %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
    224   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
    225   %conv = trunc i64 %i.03 to i32
    226   %mul = mul i64 %i.03, 3
    227   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
    228   store i32 %conv, i32* %arrayidx, align 4
    229   %0 = mul i64 %i.03, -3
    230   %sub = add i64 %0, 5
    231   %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
    232   %1 = load i32, i32* %arrayidx2, align 4
    233   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
    234   store i32 %1, i32* %B.addr.02, align 4
    235   %inc = add i64 %i.03, 1
    236   %exitcond = icmp ne i64 %inc, %n
    237   br i1 %exitcond, label %for.body, label %for.end.loopexit
    238 
    239 for.end.loopexit:                                 ; preds = %for.body
    240   br label %for.end
    241 
    242 for.end:                                          ; preds = %for.end.loopexit, %entry
    243   ret void
    244 }
    245 
    246 
    247 ;;  for (long unsigned i = 0; i < 4; i++) {
    248 ;;    A[i] = i;
    249 ;;    *B++ = A[5 - i];
    250 
    251 define void @weakcrossing6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
    252 entry:
    253   br label %for.body
    254 
    255 ; CHECK: da analyze - none!
    256 ; CHECK: da analyze - flow [<>] splitable!
    257 ; CHECK: da analyze - split level = 1, iteration = 2!
    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   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
    268   store i32 %conv, i32* %arrayidx, align 4
    269   %sub = sub i64 5, %i.02
    270   %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
    271   %0 = load i32, i32* %arrayidx1, align 4
    272   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
    273   store i32 %0, i32* %B.addr.01, align 4
    274   %inc = add i64 %i.02, 1
    275   %exitcond = icmp ne i64 %inc, 4
    276   br i1 %exitcond, label %for.body, label %for.end
    277 
    278 for.end:                                          ; preds = %for.body
    279   ret void
    280 }
    281