• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -analyze -basicaa -lda | FileCheck %s
2
3@x = common global [256 x i32] zeroinitializer, align 4
4@y = common global [256 x i32] zeroinitializer, align 4
5
6;; for (i = 0; i < 256; i++)
7;;   x[i] = x[i] + y[i]
8
9define void @f1(...) nounwind {
10entry:
11  br label %for.body
12
13for.body:
14  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
15  %y.addr = getelementptr [256 x i32]* @y, i64 0, i64 %i
16  %x.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i
17  %x = load i32* %x.addr      ; 0
18  %y = load i32* %y.addr      ; 1
19  %r = add i32 %y, %x
20  store i32 %r, i32* %x.addr  ; 2
21; CHECK: 0,2: dep
22; CHECK: 1,2: ind
23  %i.next = add i64 %i, 1
24  %exitcond = icmp eq i64 %i.next, 256
25  br i1 %exitcond, label %for.end, label %for.body
26
27for.end:
28  ret void
29}
30
31;; for (i = 0; i < 256; i++)
32;;   x[i+1] = x[i] + y[i]
33
34define void @f2(...) nounwind {
35entry:
36  br label %for.body
37
38for.body:
39  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
40  %y.ld.addr = getelementptr [256 x i32]* @y, i64 0, i64 %i
41  %x.ld.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i
42  %i.next = add i64 %i, 1
43  %x.st.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i.next
44  %x = load i32* %x.ld.addr     ; 0
45  %y = load i32* %y.ld.addr     ; 1
46  %r = add i32 %y, %x
47  store i32 %r, i32* %x.st.addr ; 2
48; CHECK: 0,2: dep
49; CHECK: 1,2: ind
50  %exitcond = icmp eq i64 %i.next, 256
51  br i1 %exitcond, label %for.end, label %for.body
52
53for.end:
54  ret void
55}
56
57;; for (i = 0; i < 10; i++)
58;;   x[i+20] = x[i] + y[i]
59
60define void @f3(...) nounwind {
61entry:
62  br label %for.body
63
64for.body:
65  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
66  %y.ld.addr = getelementptr [256 x i32]* @y, i64 0, i64 %i
67  %x.ld.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i
68  %i.20 = add i64 %i, 20
69  %x.st.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i.20
70  %x = load i32* %x.ld.addr     ; 0
71  %y = load i32* %y.ld.addr     ; 1
72  %r = add i32 %y, %x
73  store i32 %r, i32* %x.st.addr ; 2
74; CHECK: 0,2: dep
75; CHECK: 1,2: ind
76  %i.next = add i64 %i, 1
77  %exitcond = icmp eq i64 %i.next, 10
78  br i1 %exitcond, label %for.end, label %for.body
79
80for.end:
81  ret void
82}
83
84;; for (i = 0; i < 10; i++)
85;;   x[10*i+1] = x[10*i] + y[i]
86
87define void @f4(...) nounwind {
88entry:
89  br label %for.body
90
91for.body:
92  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
93  %i.10 = mul i64 %i, 10
94  %y.ld.addr = getelementptr [256 x i32]* @y, i64 0, i64 %i.10
95  %x.ld.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i.10
96  %i.10.1 = add i64 %i.10, 1
97  %x.st.addr = getelementptr [256 x i32]* @x, i64 0, i64 %i.10.1
98  %x = load i32* %x.ld.addr     ; 0
99  %y = load i32* %y.ld.addr     ; 1
100  %r = add i32 %y, %x
101  store i32 %r, i32* %x.st.addr ; 2
102; CHECK: 0,2: dep
103; CHECK: 1,2: ind
104  %i.next = add i64 %i, 1
105  %exitcond = icmp eq i64 %i.next, 10
106  br i1 %exitcond, label %for.end, label %for.body
107
108for.end:
109  ret void
110}
111