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