xref: /llvm-project/mlir/test/Target/LLVMIR/Import/metadata-loop.ll (revision f0b0c02504899c1bc00c6e6428e7aebe9ea5beb1)
1; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
2
3; CHECK-DAG: #[[$GROUP0:.*]] = #llvm.access_group<id = {{.*}}>
4; CHECK-DAG: #[[$GROUP1:.*]] = #llvm.access_group<id = {{.*}}>
5; CHECK-DAG: #[[$GROUP2:.*]] = #llvm.access_group<id = {{.*}}>
6; CHECK-DAG: #[[$GROUP3:.*]] = #llvm.access_group<id = {{.*}}>
7
8; CHECK-LABEL: llvm.func @access_group
9define void @access_group(ptr %arg1) {
10  ; CHECK:  access_groups = [#[[$GROUP0]], #[[$GROUP1]]]
11  %1 = load i32, ptr %arg1, !llvm.access.group !0
12  ; CHECK:  access_groups = [#[[$GROUP2]], #[[$GROUP0]]]
13  %2 = load i32, ptr %arg1, !llvm.access.group !1
14  ; CHECK:  access_groups = [#[[$GROUP3]]]
15  %3 = load i32, ptr %arg1, !llvm.access.group !2
16  ret void
17}
18
19!0 = !{!3, !4}
20!1 = !{!5, !3}
21!2 = distinct !{}
22!3 = distinct !{}
23!4 = distinct !{}
24!5 = distinct !{}
25
26; // -----
27
28; CHECK-LABEL: llvm.func @supported_ops
29define void @supported_ops(ptr %arg1, float %arg2, i32 %arg3, i32 %arg4) {
30  ; CHECK: llvm.load {{.*}}access_groups =
31  %1 = load i32, ptr %arg1, !llvm.access.group !0
32  ; CHECK: llvm.store {{.*}}access_groups =
33  store i32 %1, ptr %arg1, !llvm.access.group !0
34  ; CHECK: llvm.atomicrmw {{.*}}access_groups =
35  %2 = atomicrmw fmax ptr %arg1, float %arg2 acquire, !llvm.access.group !0
36  ; CHECK: llvm.cmpxchg {{.*}}access_groups =
37  %3 = cmpxchg ptr %arg1, i32 %arg3, i32 %arg4 monotonic seq_cst, !llvm.access.group !0
38  ; CHECK: "llvm.intr.memcpy"{{.*}}access_groups =
39  call void @llvm.memcpy.p0.p0.i32(ptr %arg1, ptr %arg1, i32 4, i1 false), !llvm.access.group !0
40  ; CHECK: "llvm.intr.memset"{{.*}}access_groups =
41  call void @llvm.memset.p0.i32(ptr %arg1, i8 42, i32 4, i1 false), !llvm.access.group !0
42  ; CHECK: llvm.call{{.*}}access_groups =
43  call void @foo(ptr %arg1), !llvm.access.group !0
44  ret void
45}
46
47declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg)
48declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)
49declare void @foo(ptr %arg1)
50
51!0 = !{!1, !2}
52!1 = distinct !{}
53!2 = distinct !{}
54
55; // -----
56
57; CHECK: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<disableNonforced = true, mustProgress = true, isVectorized = true>
58
59; CHECK-LABEL: @simple
60define void @simple(i64 %n, ptr %A) {
61entry:
62; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
63  br label %end, !llvm.loop !1
64end:
65  ret void
66}
67
68!1 = distinct !{!1, !2, !3, !4}
69!2 = !{!"llvm.loop.disable_nonforced"}
70!3 = !{!"llvm.loop.mustprogress"}
71!4 = !{!"llvm.loop.isvectorized", i32 1}
72
73; // -----
74
75; CHECK-DAG: #[[FOLLOWUP:.*]] = #llvm.loop_annotation<disableNonforced = true>
76; CHECK-DAG: #[[VECTORIZE_ATTR:.*]] = #llvm.loop_vectorize<disable = false, predicateEnable = true, scalableEnable = false, width = 16 : i32, followupVectorized = #[[FOLLOWUP]], followupEpilogue = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
77; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<vectorize = #[[VECTORIZE_ATTR]]>
78
79; CHECK-LABEL: @vectorize
80define void @vectorize(i64 %n, ptr %A) {
81entry:
82; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
83  br label %end, !llvm.loop !1
84end:
85  ret void
86}
87
88!1 = distinct !{!1, !2, !3, !4, !5, !6, !7, !8}
89!2 = !{!"llvm.loop.vectorize.enable", i1 1}
90!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 1}
91!4 = !{!"llvm.loop.vectorize.scalable.enable", i1 0}
92!5 = !{!"llvm.loop.vectorize.width", i32 16}
93!6 = !{!"llvm.loop.vectorize.followup_vectorized", !9}
94!7 = !{!"llvm.loop.vectorize.followup_epilogue", !9}
95!8 = !{!"llvm.loop.vectorize.followup_all", !9}
96
97!9 = distinct !{!9, !10}
98!10 = !{!"llvm.loop.disable_nonforced"}
99
100; // -----
101
102; CHECK-DAG: #[[INTERLEAVE_ATTR:.*]] = #llvm.loop_interleave<count = 8 : i32>
103; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<interleave = #[[INTERLEAVE_ATTR]]>
104
105; CHECK-LABEL: @interleave
106define void @interleave(i64 %n, ptr %A) {
107entry:
108; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
109  br label %end, !llvm.loop !1
110end:
111  ret void
112}
113
114!1 = distinct !{!1, !2}
115!2 = !{!"llvm.loop.interleave.count", i32 8}
116
117; // -----
118
119; CHECK-DAG: #[[FOLLOWUP:.*]] = #llvm.loop_annotation<disableNonforced = true>
120; CHECK-DAG: #[[UNROLL_ATTR:.*]] = #llvm.loop_unroll<disable = false, count = 16 : i32, runtimeDisable = true, full = true, followupUnrolled = #[[FOLLOWUP]], followupRemainder = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
121; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<unroll = #[[UNROLL_ATTR]]>
122
123; CHECK-LABEL: @unroll
124define void @unroll(i64 %n, ptr %A) {
125entry:
126; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
127  br label %end, !llvm.loop !1
128end:
129  ret void
130}
131
132!1 = distinct !{!1, !2, !3, !4, !5, !6, !7, !8}
133!2 = !{!"llvm.loop.unroll.enable"}
134!3 = !{!"llvm.loop.unroll.count", i32 16}
135!4 = !{!"llvm.loop.unroll.runtime.disable"}
136!5 = !{!"llvm.loop.unroll.full"}
137!6 = !{!"llvm.loop.unroll.followup_unrolled", !9}
138!7 = !{!"llvm.loop.unroll.followup_remainder", !9}
139!8 = !{!"llvm.loop.unroll.followup_all", !9}
140
141!9 = distinct !{!9, !10}
142!10 = !{!"llvm.loop.disable_nonforced"}
143
144; // -----
145
146; CHECK-DAG: #[[UNROLL_ATTR:.*]] = #llvm.loop_unroll<disable = true>
147; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<unroll = #[[UNROLL_ATTR]]>
148
149; CHECK-LABEL: @unroll_disable
150define void @unroll_disable(i64 %n, ptr %A) {
151entry:
152; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
153  br label %end, !llvm.loop !1
154end:
155  ret void
156}
157
158!1 = distinct !{!1, !2}
159!2 = !{!"llvm.loop.unroll.disable"}
160
161; // -----
162
163; CHECK-DAG: #[[FOLLOWUP:.*]] = #llvm.loop_annotation<disableNonforced = true>
164; CHECK-DAG: #[[UNROLL_AND_JAM_ATTR:.*]] = #llvm.loop_unroll_and_jam<disable = false, count = 32 : i32, followupOuter = #[[FOLLOWUP]], followupInner = #[[FOLLOWUP]], followupRemainderOuter = #[[FOLLOWUP]], followupRemainderInner = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
165; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<unrollAndJam = #[[UNROLL_AND_JAM_ATTR]]>
166
167; CHECK-LABEL: @unroll_and_jam
168define void @unroll_and_jam(i64 %n, ptr %A) {
169entry:
170; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
171  br label %end, !llvm.loop !1
172end:
173  ret void
174}
175
176!1 = distinct !{!1, !2, !3, !4, !5, !6, !7, !8}
177!2 = !{!"llvm.loop.unroll_and_jam.enable"}
178!3 = !{!"llvm.loop.unroll_and_jam.count", i32 32}
179!4 = !{!"llvm.loop.unroll_and_jam.followup_outer", !9}
180!5 = !{!"llvm.loop.unroll_and_jam.followup_inner", !9}
181!6 = !{!"llvm.loop.unroll_and_jam.followup_remainder_outer", !9}
182!7 = !{!"llvm.loop.unroll_and_jam.followup_remainder_inner", !9}
183!8 = !{!"llvm.loop.unroll_and_jam.followup_all", !9}
184
185!9 = distinct !{!9, !10}
186!10 = !{!"llvm.loop.disable_nonforced"}
187
188; // -----
189
190; CHECK-DAG: #[[LICM_ATTR:.*]] = #llvm.loop_licm<disable = true, versioningDisable = true>
191; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<licm = #[[LICM_ATTR]]>
192
193; CHECK-LABEL: @licm
194define void @licm(i64 %n, ptr %A) {
195entry:
196; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
197  br label %end, !llvm.loop !1
198end:
199  ret void
200}
201
202!1 = distinct !{!1, !2, !3}
203!2 = !{!"llvm.licm.disable"}
204!3 = !{!"llvm.loop.licm_versioning.disable"}
205
206; // -----
207
208; CHECK-DAG: #[[FOLLOWUP:.*]] = #llvm.loop_annotation<disableNonforced = true>
209; CHECK-DAG: #[[DISTRIBUTE_ATTR:.*]] = #llvm.loop_distribute<disable = true, followupCoincident = #[[FOLLOWUP]], followupSequential = #[[FOLLOWUP]], followupFallback = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
210; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<distribute = #[[DISTRIBUTE_ATTR]]>
211
212; CHECK-LABEL: @distribute
213define void @distribute(i64 %n, ptr %A) {
214entry:
215; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
216  br label %end, !llvm.loop !1
217end:
218  ret void
219}
220
221!1 = distinct !{!1, !2, !3, !4, !5, !6}
222!2 = !{!"llvm.loop.distribute.enable", i1 0}
223!3 = !{!"llvm.loop.distribute.followup_coincident", !9}
224!4 = !{!"llvm.loop.distribute.followup_sequential", !9}
225!5 = !{!"llvm.loop.distribute.followup_fallback", !9}
226!6 = !{!"llvm.loop.distribute.followup_all", !9}
227
228!9 = distinct !{!9, !10}
229!10 = !{!"llvm.loop.disable_nonforced"}
230
231; // -----
232
233; CHECK-DAG: #[[PIPELINE_ATTR:.*]] = #llvm.loop_pipeline<disable = false, initiationinterval = 2 : i32>
234; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<pipeline = #[[PIPELINE_ATTR]]>
235
236; CHECK-LABEL: @pipeline
237define void @pipeline(i64 %n, ptr %A) {
238entry:
239; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
240  br label %end, !llvm.loop !1
241end:
242  ret void
243}
244
245!1 = distinct !{!1, !2, !3}
246!2 = !{!"llvm.loop.pipeline.disable", i1 0}
247!3 = !{!"llvm.loop.pipeline.initiationinterval", i32 2}
248
249; // -----
250
251; CHECK-DAG: #[[PEELED_ATTR:.*]] = #llvm.loop_peeled<count = 5 : i32>
252; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<peeled = #[[PEELED_ATTR]]>
253
254; CHECK-LABEL: @peeled
255define void @peeled(i64 %n, ptr %A) {
256entry:
257; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
258  br label %end, !llvm.loop !1
259end:
260  ret void
261}
262
263!1 = distinct !{!1, !2}
264!2 = !{!"llvm.loop.peeled.count", i32 5}
265
266; // -----
267
268; CHECK-DAG: #[[UNSWITCH_ATTR:.*]] = #llvm.loop_unswitch<partialDisable = true>
269; CHECK-DAG: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<unswitch = #[[UNSWITCH_ATTR]]>
270
271; CHECK-LABEL: @unswitched
272define void @unswitched(i64 %n, ptr %A) {
273entry:
274; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
275  br label %end, !llvm.loop !1
276end:
277  ret void
278}
279
280!1 = distinct !{!1, !2}
281!2 = !{!"llvm.loop.unswitch.partial.disable"}
282
283; // -----
284
285; CHECK: #[[GROUP0:.*]] = #llvm.access_group<id = {{.*}}>
286; CHECK: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<parallelAccesses = #[[GROUP0]]>
287
288; CHECK-LABEL: @parallel_accesses
289define void @parallel_accesses(ptr %arg) {
290entry:
291  %0 = load i32, ptr %arg, !llvm.access.group !0
292; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
293  br label %end, !llvm.loop !1
294end:
295  ret void
296}
297
298!0 = distinct !{}
299!1 = distinct !{!1, !2}
300!2 = !{!"llvm.loop.parallel_accesses", !0}
301
302; // -----
303
304; CHECK: #[[GROUP0:.*]] = #llvm.access_group<id = {{.*}}>
305; CHECK: #[[GROUP1:.*]] = #llvm.access_group<id = {{.*}}>
306; CHECK: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<parallelAccesses = #[[GROUP0]], #[[GROUP1]]>
307
308; CHECK-LABEL: @multiple_parallel_accesses
309define void @multiple_parallel_accesses(ptr %arg) {
310entry:
311  %0 = load i32, ptr %arg, !llvm.access.group !0
312  %1 = load i32, ptr %arg, !llvm.access.group !3
313; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
314  br label %end, !llvm.loop !1
315end:
316  ret void
317}
318
319!0 = distinct !{}
320!1 = distinct !{!1, !2}
321!2 = !{!"llvm.loop.parallel_accesses", !0, !3}
322!3 = distinct !{}
323
324; // -----
325
326; Verify the unused access group is not imported.
327; CHECK-COUNT-1: #llvm.access_group
328
329; CHECK-LABEL: @unused_parallel_access
330define void @unused_parallel_access(ptr %arg) {
331entry:
332  %0 = load i32, ptr %arg, !llvm.access.group !0
333  br label %end, !llvm.loop !1
334end:
335  ret void
336}
337
338!0 = distinct !{}
339!1 = distinct !{!1, !2}
340!2 = !{!"llvm.loop.parallel_accesses", !0, !3}
341!3 = distinct !{}
342
343; // -----
344
345; CHECK: #[[start_loc:.*]] = loc("metadata-loop.ll":1:2)
346; CHECK: #[[end_loc:.*]] = loc("metadata-loop.ll":2:2)
347; CHECK: #[[SUBPROGRAM:.*]] = #llvm.di_subprogram<
348; CHECK: #[[start_loc_fused:.*]] = loc(fused<#[[SUBPROGRAM]]>[#[[start_loc]]])
349; CHECK: #[[end_loc_fused:.*]] = loc(fused<#[[SUBPROGRAM]]>[#[[end_loc]]])
350; CHECK: #[[$ANNOT_ATTR:.*]] = #llvm.loop_annotation<
351; CHECK-SAME: mustProgress = true
352; CHECK-SAME: startLoc = #[[start_loc_fused]]
353; CHECK-SAME: endLoc = #[[end_loc_fused]]
354
355; CHECK-LABEL: @loop_locs
356define void @loop_locs(i64 %n, ptr %A) {
357entry:
358; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}
359  br label %end, !llvm.loop !6
360end:
361  ret void
362}
363
364!llvm.dbg.cu = !{!1}
365!llvm.module.flags = !{!0}
366!0 = !{i32 2, !"Debug Info Version", i32 3}
367!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)
368!2 = !DIFile(filename: "metadata-loop.ll", directory: "/")
369!3 = distinct !DISubprogram(name: "loop_locs", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)
370!4 = !DILocation(line: 1, column: 2, scope: !3)
371!5 = !DILocation(line: 2, column: 2, scope: !3)
372
373!6 = distinct !{!6, !4, !5, !7}
374!7 = !{!"llvm.loop.mustprogress"}
375