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