Home | History | Annotate | Download | only in DependenceAnalysis
      1 ; RUN: opt < %s -analyze -basicaa -globals-aa -da | FileCheck %s
      2 define void @i32_subscript(i32* %a) {
      3 entry:
      4   br label %for.body
      5 
      6 for.body:
      7   %i = phi i32 [ 0, %entry ], [ %i.inc, %for.body ]
      8   %a.addr = getelementptr i32, i32* %a, i32 %i
      9   %a.addr.2 = getelementptr i32, i32* %a, i32 5
     10   %0 = load i32, i32* %a.addr, align 4
     11   %1 = add i32 %0, 1
     12   store i32 %1, i32* %a.addr.2, align 4
     13   %i.inc = add nsw i32 %i, 1
     14   %i.inc.ext = sext i32 %i to i64
     15   %exitcond = icmp ne i64 %i.inc.ext, 100
     16   br i1 %exitcond, label %for.body, label %for.end
     17 
     18 for.end:
     19   ret void
     20 }
     21 ; CHECK: none
     22 ; CHECK: anti
     23 ; CHECK: output
     24 
     25 
     26 ; Test for a bug, which caused an assert in ScalarEvolution because
     27 ; the Dependence Analyzer attempted to zero extend a type to a smaller
     28 ; type.
     29 
     30 ; void t(unsigned int *a, unsigned int n) {
     31 ;   for (unsigned int i = 0; i != n; i++) {
     32 ;     a[(unsigned short)i] = g;
     33 ;  }}
     34 
     35 @g = common global i32 0, align 4
     36 
     37 define void @t(i32* noalias %a, i32 %n) nounwind {
     38 entry:
     39   %cmp1 = icmp eq i32 %n, 0
     40   br i1 %cmp1, label %for.end, label %for.body
     41 
     42 for.body:
     43   %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
     44   %0 = load i32, i32* @g, align 4
     45   %idxprom = and i32 %i.02, 65535
     46   %arrayidx = getelementptr inbounds i32, i32* %a, i32 %idxprom
     47   store i32 %0, i32* %arrayidx, align 4
     48   %inc = add i32 %i.02, 1
     49   %cmp = icmp eq i32 %inc, %n
     50   br i1 %cmp, label %for.end, label %for.body
     51 
     52 for.end:
     53   ret void
     54 }
     55 ; CHECK: input
     56 ; CHECK: none
     57 ; CHECK: output
     58 
     59 define void @i16_wrap(i64* %a) {
     60 entry:
     61   br label %for.body
     62 for.body:
     63   %i = phi i64 [0, %entry], [%i.inc, %for.inc]
     64   %i.tr = trunc i64 %i to i16
     65   %idx = getelementptr i64, i64* %a, i16 %i.tr
     66   %0 = load i64, i64* %idx
     67   %1 = add i64 %0, 1
     68 store i64 %1, i64* %idx
     69   br label %for.inc
     70 
     71 for.inc:
     72   %i.inc = add nuw i64 %i, 1
     73   %cmp = icmp ult i64 %i.inc, 17179869184
     74   br i1 %cmp, label %for.body, label %for.end
     75 for.end:
     76   ret void
     77 }
     78 ; CHECK: input
     79 ; CHECK: anti
     80 ; CHECK: output
     81 
     82 define void @i8_stride_wrap(i32* noalias %a, i32* noalias %b) {
     83 entry:
     84   br label %for.body
     85 for.body:
     86   %i = phi i32 [1,%entry], [%i.inc, %for.inc]
     87   %i.tr = trunc i32 %i to i8
     88   %idx = getelementptr i32, i32* %a, i8 %i.tr
     89   %idx.2 = getelementptr i32, i32* %b, i32 %i
     90   %0 = load i32, i32* %idx, align 4
     91   %1 = add i32 %0, 1
     92   store i32 %1, i32* %idx.2, align 4
     93   br label %for.inc
     94 
     95 for.inc:
     96   %i.inc = add nsw i32 %i, 256
     97   %exitcond = icmp ult i32 %i, 65536
     98   br i1 %exitcond, label %for.body, label %for.end
     99 
    100 for.end:
    101   ret void
    102 }
    103 ; CHECK: input
    104 ; CHECK: none
    105 ; CHECK: none
    106