• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -analyze -basicaa -globals-aa -da | FileCheck %s
2define void @i32_subscript(i32* %a) {
3entry:
4  br label %for.body
5
6for.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
18for.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
37define void @t(i32* noalias %a, i32 %n) nounwind {
38entry:
39  %cmp1 = icmp eq i32 %n, 0
40  br i1 %cmp1, label %for.end, label %for.body
41
42for.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
52for.end:
53  ret void
54}
55; CHECK: input
56; CHECK: none
57; CHECK: output
58
59define void @i16_wrap(i64* %a) {
60entry:
61  br label %for.body
62for.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
68store i64 %1, i64* %idx
69  br label %for.inc
70
71for.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
75for.end:
76  ret void
77}
78; CHECK: input
79; CHECK: anti
80; CHECK: output
81
82define void @i8_stride_wrap(i32* noalias %a, i32* noalias %b) {
83entry:
84  br label %for.body
85for.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
95for.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
100for.end:
101  ret void
102}
103; CHECK: input
104; CHECK: none
105; CHECK: none
106