xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/AA.ll (revision 46f9cddfd7e40998422d1e34a3f1193210ee2fb8)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -disable-output "-passes=print<da>"                            \
3; RUN: "-aa-pipeline=basic-aa,tbaa" 2>&1 | FileCheck %s
4
5define void @test_no_noalias(ptr %A, ptr %B) {
6; CHECK-LABEL: 'test_no_noalias'
7; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4
8; CHECK-NEXT:    da analyze - none!
9; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4
10; CHECK-NEXT:    da analyze - confused!
11; CHECK-NEXT:  Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4
12; CHECK-NEXT:    da analyze - none!
13;
14  store i32 1, ptr %A
15  store i32 2, ptr %B
16  ret void
17}
18
19define void @test_one_noalias(ptr noalias %A, ptr %B) {
20; CHECK-LABEL: 'test_one_noalias'
21; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4
22; CHECK-NEXT:    da analyze - none!
23; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4
24; CHECK-NEXT:    da analyze - none!
25; CHECK-NEXT:  Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4
26; CHECK-NEXT:    da analyze - none!
27;
28  store i32 1, ptr %A
29  store i32 2, ptr %B
30  ret void
31}
32
33define void @test_two_noalias(ptr noalias %A, ptr noalias %B) {
34; CHECK-LABEL: 'test_two_noalias'
35; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4
36; CHECK-NEXT:    da analyze - none!
37; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4
38; CHECK-NEXT:    da analyze - none!
39; CHECK-NEXT:  Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4
40; CHECK-NEXT:    da analyze - none!
41;
42  store i32 1, ptr %A
43  store i32 2, ptr %B
44  ret void
45}
46
47@g = global i32 5
48define void @test_global_alias(ptr %A) {
49; CHECK-LABEL: 'test_global_alias'
50; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4
51; CHECK-NEXT:    da analyze - none!
52; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr @g, align 4
53; CHECK-NEXT:    da analyze - confused!
54; CHECK-NEXT:  Src: store i32 2, ptr @g, align 4 --> Dst: store i32 2, ptr @g, align 4
55; CHECK-NEXT:    da analyze - none!
56;
57  store i32 1, ptr %A
58  store i32 2, ptr @g
59  ret void
60}
61
62define void @test_global_noalias(ptr noalias %A) {
63; CHECK-LABEL: 'test_global_noalias'
64; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4
65; CHECK-NEXT:    da analyze - none!
66; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr @g, align 4
67; CHECK-NEXT:    da analyze - none!
68; CHECK-NEXT:  Src: store i32 2, ptr @g, align 4 --> Dst: store i32 2, ptr @g, align 4
69; CHECK-NEXT:    da analyze - none!
70;
71  store i32 1, ptr %A
72  store i32 2, ptr @g
73  ret void
74}
75
76
77@a = global i16 5, align 2
78@b = global ptr @a, align 4
79define void @test_global_size() {
80; CHECK-LABEL: 'test_global_size'
81; CHECK-NEXT:  Src: %l0 = load ptr, ptr @b, align 4 --> Dst: %l0 = load ptr, ptr @b, align 4
82; CHECK-NEXT:    da analyze - none!
83; CHECK-NEXT:  Src: %l0 = load ptr, ptr @b, align 4 --> Dst: %l1 = load i16, ptr %l0, align 2
84; CHECK-NEXT:    da analyze - confused!
85; CHECK-NEXT:  Src: %l0 = load ptr, ptr @b, align 4 --> Dst: store i16 1, ptr @a, align 2
86; CHECK-NEXT:    da analyze - none!
87; CHECK-NEXT:  Src: %l1 = load i16, ptr %l0, align 2 --> Dst: %l1 = load i16, ptr %l0, align 2
88; CHECK-NEXT:    da analyze - none!
89; CHECK-NEXT:  Src: %l1 = load i16, ptr %l0, align 2 --> Dst: store i16 1, ptr @a, align 2
90; CHECK-NEXT:    da analyze - confused!
91; CHECK-NEXT:  Src: store i16 1, ptr @a, align 2 --> Dst: store i16 1, ptr @a, align 2
92; CHECK-NEXT:    da analyze - none!
93;
94  %l0 = load ptr, ptr @b, align 4
95  %l1 = load i16, ptr %l0, align 2
96  store i16 1, ptr @a, align 2
97  ret void
98}
99
100define void @test_tbaa_same(ptr %A, ptr %B) {
101; CHECK-LABEL: 'test_tbaa_same'
102; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 1, ptr %A, align 4, !tbaa !0
103; CHECK-NEXT:    da analyze - none!
104; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 2, ptr %B, align 4, !tbaa !0
105; CHECK-NEXT:    da analyze - confused!
106; CHECK-NEXT:  Src: store i32 2, ptr %B, align 4, !tbaa !0 --> Dst: store i32 2, ptr %B, align 4, !tbaa !0
107; CHECK-NEXT:    da analyze - none!
108;
109  store i32 1, ptr %A, !tbaa !5
110  store i32 2, ptr %B, !tbaa !5
111  ret void
112}
113
114define void @test_tbaa_diff(ptr %A, ptr %B) {
115; CHECK-LABEL: 'test_tbaa_diff'
116; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 1, ptr %A, align 4, !tbaa !0
117; CHECK-NEXT:    da analyze - none!
118; CHECK-NEXT:  Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i16 2, ptr %B, align 2, !tbaa !4
119; CHECK-NEXT:    da analyze - none!
120; CHECK-NEXT:  Src: store i16 2, ptr %B, align 2, !tbaa !4 --> Dst: store i16 2, ptr %B, align 2, !tbaa !4
121; CHECK-NEXT:    da analyze - none!
122;
123  store i32 1, ptr %A, !tbaa !5
124  store i16 2, ptr %B, !tbaa !9
125  ret void
126}
127
128define void @tbaa_loop(i32 %I, i32 %J, ptr nocapture %A, ptr nocapture readonly %B) {
129; CHECK-LABEL: 'tbaa_loop'
130; CHECK-NEXT:  Src: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0 --> Dst: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0
131; CHECK-NEXT:    da analyze - input [* *]!
132; CHECK-NEXT:  Src: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0 --> Dst: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4
133; CHECK-NEXT:    da analyze - none!
134; CHECK-NEXT:  Src: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4 --> Dst: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4
135; CHECK-NEXT:    da analyze - output [*]!
136;
137entry:
138  %cmp = icmp ne i32 %J, 0
139  %cmp122 = icmp ne i32 %I, 0
140  %or.cond = and i1 %cmp, %cmp122
141  br i1 %or.cond, label %for.outer.preheader, label %for.end
142
143for.outer.preheader:
144  br label %for.outer
145
146for.outer:
147  %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ]
148  br label %for.inner
149
150for.inner:
151  %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ]
152  %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ]
153  %arrayidx.us = getelementptr inbounds i16, ptr %B, i32 %j.us
154  %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !9
155  %sext = sext i16 %0 to i32
156  %add.us = add i32 %sext, %sum1.us
157  %inc.us = add nuw i32 %j.us, 1
158  %exitcond = icmp eq i32 %inc.us, %J
159  br i1 %exitcond, label %for.latch, label %for.inner
160
161for.latch:
162  %add.us.lcssa = phi i32 [ %add.us, %for.inner ]
163  %arrayidx6.us = getelementptr inbounds i32, ptr %A, i32 %i.us
164  store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !5
165  %add8.us = add nuw i32 %i.us, 1
166  %exitcond25 = icmp eq i32 %add8.us, %I
167  br i1 %exitcond25, label %for.end.loopexit, label %for.outer
168
169for.end.loopexit:
170  br label %for.end
171
172for.end:
173  ret void
174}
175
176!5 = !{!6, !6, i64 0}
177!6 = !{!"int", !7, i64 0}
178!7 = !{!"omnipotent char", !8, i64 0}
179!8 = !{!"Simple C/C++ TBAA"}
180!9 = !{!10, !10, i64 0}
181!10 = !{!"short", !7, i64 0}
182