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