annotate llvm/test/Transforms/LICM/call-hoisting.ll @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ; RUN: opt -S -basicaa -licm %s | FileCheck %s
anatofuz
parents:
diff changeset
2 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop(licm)' < %s -S | FileCheck %s
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 declare i32 @load(i32* %p) argmemonly readonly nounwind
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 define void @test_load(i32* noalias %loc, i32* noalias %sink) {
anatofuz
parents:
diff changeset
7 ; CHECK-LABEL: @test_load
anatofuz
parents:
diff changeset
8 ; CHECK-LABEL: entry:
anatofuz
parents:
diff changeset
9 ; CHECK: call i32 @load
anatofuz
parents:
diff changeset
10 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
11 entry:
anatofuz
parents:
diff changeset
12 br label %loop
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 loop:
anatofuz
parents:
diff changeset
15 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
16 %ret = call i32 @load(i32* %loc)
anatofuz
parents:
diff changeset
17 store volatile i32 %ret, i32* %sink
anatofuz
parents:
diff changeset
18 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
19 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
20 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 exit:
anatofuz
parents:
diff changeset
23 ret void
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 declare void @store(i32 %val, i32* %p) argmemonly writeonly nounwind
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 define void @test(i32* %loc) {
anatofuz
parents:
diff changeset
30 ; CHECK-LABEL: @test
anatofuz
parents:
diff changeset
31 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
32 ; CHECK: call void @store
anatofuz
parents:
diff changeset
33 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
34 entry:
anatofuz
parents:
diff changeset
35 br label %loop
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 loop:
anatofuz
parents:
diff changeset
38 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
39 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
40 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
41 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
42 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 exit:
anatofuz
parents:
diff changeset
45 ret void
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 define void @test_multiexit(i32* %loc, i1 %earlycnd) {
anatofuz
parents:
diff changeset
49 ; CHECK-LABEL: @test_multiexit
anatofuz
parents:
diff changeset
50 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
51 ; CHECK: call void @store
anatofuz
parents:
diff changeset
52 ; CHECK-LABEL: backedge:
anatofuz
parents:
diff changeset
53 entry:
anatofuz
parents:
diff changeset
54 br label %loop
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 loop:
anatofuz
parents:
diff changeset
57 %iv = phi i32 [0, %entry], [%iv.next, %backedge]
anatofuz
parents:
diff changeset
58 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
59 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
60 br i1 %earlycnd, label %exit1, label %backedge
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 backedge:
anatofuz
parents:
diff changeset
63 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
64 br i1 %cmp, label %loop, label %exit2
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 exit1:
anatofuz
parents:
diff changeset
67 ret void
anatofuz
parents:
diff changeset
68 exit2:
anatofuz
parents:
diff changeset
69 ret void
anatofuz
parents:
diff changeset
70 }
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 define void @neg_lv_value(i32* %loc) {
anatofuz
parents:
diff changeset
73 ; CHECK-LABEL: @neg_lv_value
anatofuz
parents:
diff changeset
74 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
75 ; CHECK: call void @store
anatofuz
parents:
diff changeset
76 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
77 entry:
anatofuz
parents:
diff changeset
78 br label %loop
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 loop:
anatofuz
parents:
diff changeset
81 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
82 call void @store(i32 %iv, i32* %loc)
anatofuz
parents:
diff changeset
83 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
84 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
85 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 exit:
anatofuz
parents:
diff changeset
88 ret void
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 define void @neg_lv_addr(i32* %loc) {
anatofuz
parents:
diff changeset
92 ; CHECK-LABEL: @neg_lv_addr
anatofuz
parents:
diff changeset
93 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
94 ; CHECK: call void @store
anatofuz
parents:
diff changeset
95 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
96 entry:
anatofuz
parents:
diff changeset
97 br label %loop
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 loop:
anatofuz
parents:
diff changeset
100 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
101 %p = getelementptr i32, i32* %loc, i32 %iv
anatofuz
parents:
diff changeset
102 call void @store(i32 0, i32* %p)
anatofuz
parents:
diff changeset
103 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
104 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
105 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 exit:
anatofuz
parents:
diff changeset
108 ret void
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 define void @neg_mod(i32* %loc) {
anatofuz
parents:
diff changeset
112 ; CHECK-LABEL: @neg_mod
anatofuz
parents:
diff changeset
113 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
114 ; CHECK: call void @store
anatofuz
parents:
diff changeset
115 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
116 entry:
anatofuz
parents:
diff changeset
117 br label %loop
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 loop:
anatofuz
parents:
diff changeset
120 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
121 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
122 store i32 %iv, i32* %loc
anatofuz
parents:
diff changeset
123 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
124 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
125 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 exit:
anatofuz
parents:
diff changeset
128 ret void
anatofuz
parents:
diff changeset
129 }
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 define void @neg_ref(i32* %loc) {
anatofuz
parents:
diff changeset
132 ; CHECK-LABEL: @neg_ref
anatofuz
parents:
diff changeset
133 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
134 ; CHECK: call void @store
anatofuz
parents:
diff changeset
135 ; CHECK-LABEL: exit1:
anatofuz
parents:
diff changeset
136 entry:
anatofuz
parents:
diff changeset
137 br label %loop
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 loop:
anatofuz
parents:
diff changeset
140 %iv = phi i32 [0, %entry], [%iv.next, %backedge]
anatofuz
parents:
diff changeset
141 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
142 %v = load i32, i32* %loc
anatofuz
parents:
diff changeset
143 %earlycnd = icmp eq i32 %v, 198
anatofuz
parents:
diff changeset
144 br i1 %earlycnd, label %exit1, label %backedge
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 backedge:
anatofuz
parents:
diff changeset
147 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
148 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
149 br i1 %cmp, label %loop, label %exit2
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 exit1:
anatofuz
parents:
diff changeset
152 ret void
anatofuz
parents:
diff changeset
153 exit2:
anatofuz
parents:
diff changeset
154 ret void
anatofuz
parents:
diff changeset
155 }
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 declare void @modref()
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 define void @neg_modref(i32* %loc) {
anatofuz
parents:
diff changeset
160 ; CHECK-LABEL: @neg_modref
anatofuz
parents:
diff changeset
161 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
162 ; CHECK: call void @store
anatofuz
parents:
diff changeset
163 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
164 entry:
anatofuz
parents:
diff changeset
165 br label %loop
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 loop:
anatofuz
parents:
diff changeset
168 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
169 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
170 call void @modref()
anatofuz
parents:
diff changeset
171 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
172 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
173 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 exit:
anatofuz
parents:
diff changeset
176 ret void
anatofuz
parents:
diff changeset
177 }
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 define void @neg_fence(i32* %loc) {
anatofuz
parents:
diff changeset
180 ; CHECK-LABEL: @neg_fence
anatofuz
parents:
diff changeset
181 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
182 ; CHECK: call void @store
anatofuz
parents:
diff changeset
183 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
184 entry:
anatofuz
parents:
diff changeset
185 br label %loop
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 loop:
anatofuz
parents:
diff changeset
188 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
189 call void @store(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
190 fence seq_cst
anatofuz
parents:
diff changeset
191 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
192 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
193 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 exit:
anatofuz
parents:
diff changeset
196 ret void
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 declare void @not_nounwind(i32 %v, i32* %p) writeonly argmemonly
anatofuz
parents:
diff changeset
200 declare void @not_argmemonly(i32 %v, i32* %p) writeonly nounwind
anatofuz
parents:
diff changeset
201 declare void @not_writeonly(i32 %v, i32* %p) argmemonly nounwind
anatofuz
parents:
diff changeset
202
anatofuz
parents:
diff changeset
203 define void @neg_not_nounwind(i32* %loc) {
anatofuz
parents:
diff changeset
204 ; CHECK-LABEL: @neg_not_nounwind
anatofuz
parents:
diff changeset
205 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
206 ; CHECK: call void @not_nounwind
anatofuz
parents:
diff changeset
207 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
208 entry:
anatofuz
parents:
diff changeset
209 br label %loop
anatofuz
parents:
diff changeset
210
anatofuz
parents:
diff changeset
211 loop:
anatofuz
parents:
diff changeset
212 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
213 call void @not_nounwind(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
214 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
215 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
216 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 exit:
anatofuz
parents:
diff changeset
219 ret void
anatofuz
parents:
diff changeset
220 }
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 define void @neg_not_argmemonly(i32* %loc) {
anatofuz
parents:
diff changeset
223 ; CHECK-LABEL: @neg_not_argmemonly
anatofuz
parents:
diff changeset
224 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
225 ; CHECK: call void @not_argmemonly
anatofuz
parents:
diff changeset
226 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
227 entry:
anatofuz
parents:
diff changeset
228 br label %loop
anatofuz
parents:
diff changeset
229
anatofuz
parents:
diff changeset
230 loop:
anatofuz
parents:
diff changeset
231 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
232 call void @not_argmemonly(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
233 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
234 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
235 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
236
anatofuz
parents:
diff changeset
237 exit:
anatofuz
parents:
diff changeset
238 ret void
anatofuz
parents:
diff changeset
239 }
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 define void @neg_not_writeonly(i32* %loc) {
anatofuz
parents:
diff changeset
242 ; CHECK-LABEL: @neg_not_writeonly
anatofuz
parents:
diff changeset
243 ; CHECK-LABEL: loop:
anatofuz
parents:
diff changeset
244 ; CHECK: call void @not_writeonly
anatofuz
parents:
diff changeset
245 ; CHECK-LABEL: exit:
anatofuz
parents:
diff changeset
246 entry:
anatofuz
parents:
diff changeset
247 br label %loop
anatofuz
parents:
diff changeset
248
anatofuz
parents:
diff changeset
249 loop:
anatofuz
parents:
diff changeset
250 %iv = phi i32 [0, %entry], [%iv.next, %loop]
anatofuz
parents:
diff changeset
251 call void @not_writeonly(i32 0, i32* %loc)
anatofuz
parents:
diff changeset
252 %iv.next = add i32 %iv, 1
anatofuz
parents:
diff changeset
253 %cmp = icmp slt i32 %iv, 200
anatofuz
parents:
diff changeset
254 br i1 %cmp, label %loop, label %exit
anatofuz
parents:
diff changeset
255
anatofuz
parents:
diff changeset
256 exit:
anatofuz
parents:
diff changeset
257 ret void
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259