xref: /llvm-project/mlir/test/Dialect/LLVMIR/loop-metadata.mlir (revision bd26ce47c820858856bd33f20b0c606973155f51)
1// RUN: mlir-opt %s --split-input-file | mlir-opt --split-input-file | FileCheck %s
2
3// CHECK-DAG: #[[FOLLOWUP:.*]] = #llvm.loop_annotation<disableNonforced = true>
4#followup = #llvm.loop_annotation<disableNonforced = true>
5
6// CHECK-DAG: #[[VECTORIZE:.*]] = #llvm.loop_vectorize<disable = false, predicateEnable = false, scalableEnable = true, width = 16 : i32, followupVectorized = #[[FOLLOWUP]], followupEpilogue = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
7#vectorize = #llvm.loop_vectorize<
8  disable = false, predicateEnable = false, scalableEnable = true, width = 16 : i32,
9  followupVectorized = #followup, followupEpilogue = #followup, followupAll = #followup
10>
11
12// CHECK-DAG: #[[INTERLEAVE:.*]] = #llvm.loop_interleave<count = 32 : i32>
13#interleave = #llvm.loop_interleave<count = 32 : i32>
14
15// CHECK-DAG: #[[UNROLL:.*]] = #llvm.loop_unroll<disable = true, count = 32 : i32, runtimeDisable = true, full = false, followupUnrolled = #[[FOLLOWUP]], followupRemainder = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
16#unroll = #llvm.loop_unroll<
17  disable = true, count = 32 : i32, runtimeDisable = true, full = false,
18  followupUnrolled = #followup, followupRemainder = #followup, followupAll = #followup
19>
20
21// CHECK-DAG: #[[UNROLL_AND_JAM:.*]] = #llvm.loop_unroll_and_jam<disable = false, count = 16 : i32, followupOuter = #[[FOLLOWUP]], followupInner = #[[FOLLOWUP]], followupRemainderOuter = #[[FOLLOWUP]], followupRemainderInner = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
22#unrollAndJam = #llvm.loop_unroll_and_jam<
23  disable = false, count = 16 : i32, followupOuter = #followup, followupInner = #followup,
24  followupRemainderOuter = #followup, followupRemainderInner = #followup, followupAll = #followup
25>
26
27// CHECK-DAG: #[[LICM:.*]] = #llvm.loop_licm<disable = false, versioningDisable = true>
28#licm = #llvm.loop_licm<disable = false, versioningDisable = true>
29
30// CHECK-DAG: #[[DISTRIBUTE:.*]] = #llvm.loop_distribute<disable = true, followupCoincident = #[[FOLLOWUP]], followupSequential = #[[FOLLOWUP]], followupFallback = #[[FOLLOWUP]], followupAll = #[[FOLLOWUP]]>
31#distribute = #llvm.loop_distribute<
32  disable = true, followupCoincident = #followup, followupSequential = #followup,
33  followupFallback = #followup, followupAll = #followup
34>
35
36// CHECK-DAG: #[[PIPELINE:.*]] = #llvm.loop_pipeline<disable = true, initiationinterval = 1 : i32>
37#pipeline = #llvm.loop_pipeline<disable = true, initiationinterval = 1 : i32>
38
39// CHECK-DAG: #[[PEELED:.*]] = #llvm.loop_peeled<count = 8 : i32>
40#peeled = #llvm.loop_peeled<count = 8 : i32>
41
42// CHECK-DAG: #[[UNSWITCH:.*]] = #llvm.loop_unswitch<partialDisable = true>
43#unswitch = #llvm.loop_unswitch<partialDisable = true>
44
45// CHECK-DAG: #[[GROUP1:.*]] = #llvm.access_group<id = {{.*}}>
46// CHECK-DAG: #[[GROUP2:.*]] = #llvm.access_group<id = {{.*}}>
47#group1 = #llvm.access_group<id = distinct[0]<>>
48#group2 = #llvm.access_group<id = distinct[1]<>>
49
50// CHECK: #[[LOOP_ANNOT:.*]] = #llvm.loop_annotation<
51// CHECK-DAG: disableNonforced = false
52// CHECK-DAG: mustProgress = true
53// CHECK-DAG: unroll = #[[UNROLL]]
54// CHECK-DAG: unrollAndJam = #[[UNROLL_AND_JAM]]
55// CHECK-DAG: licm = #[[LICM]]
56// CHECK-DAG: distribute = #[[DISTRIBUTE]]
57// CHECK-DAG: pipeline = #[[PIPELINE]]
58// CHECK-DAG: peeled = #[[PEELED]]
59// CHECK-DAG: unswitch = #[[UNSWITCH]]
60// CHECK-DAG: isVectorized = false
61// CHECK-DAG: parallelAccesses = #[[GROUP1]], #[[GROUP2]]>
62#loopMD = #llvm.loop_annotation<disableNonforced = false,
63        mustProgress = true,
64        vectorize = #vectorize,
65        interleave = #interleave,
66        unroll = #unroll,
67        unrollAndJam = #unrollAndJam,
68        licm = #licm,
69        distribute = #distribute,
70        pipeline = #pipeline,
71        peeled = #peeled,
72        unswitch = #unswitch,
73        isVectorized = false,
74        parallelAccesses = #group1, #group2>
75
76// CHECK: llvm.func @loop_annotation
77llvm.func @loop_annotation() {
78  // CHECK: llvm.br ^bb1 {llvm.loop = #[[LOOP_ANNOT]]
79  llvm.br ^bb1 {llvm.loop = #loopMD}
80^bb1:
81  llvm.return
82}
83
84// -----
85
86#di_file = #llvm.di_file<"metadata-loop.ll" in "/">
87
88// CHECK-DAG: #[[START_LOC:.*]] = loc("loop-metadata.mlir":42:4)
89#loc1 = loc("loop-metadata.mlir":42:4)
90// CHECK-DAG: #[[END_LOC:.*]] = loc("loop-metadata.mlir":52:4)
91#loc2 = loc("loop-metadata.mlir":52:4)
92
93#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, isOptimized = false, emissionKind = None>
94// CHECK-DAG: #[[SUBPROGRAM:.*]] = #llvm.di_subprogram<
95#di_subprogram = #llvm.di_subprogram<compileUnit = #di_compile_unit, scope = #di_file, name = "loop_locs", file = #di_file, subprogramFlags = Definition>
96
97// CHECK-DAG: #[[START_LOC_FUSED:.*]] = loc(fused<#[[SUBPROGRAM]]>[#[[START_LOC]]]
98#start_loc_fused = loc(fused<#di_subprogram>[#loc1])
99// CHECK-DAG: #[[END_LOC_FUSED:.*]] = loc(fused<#[[SUBPROGRAM]]>[#[[END_LOC]]]
100#end_loc_fused= loc(fused<#di_subprogram>[#loc2])
101
102// CHECK-DAG: #[[GROUP1:.*]] = #llvm.access_group<id = {{.*}}>
103// CHECK-DAG: #[[GROUP2:.*]] = #llvm.access_group<id = {{.*}}>
104#group1 = #llvm.access_group<id = distinct[0]<>>
105#group2 = #llvm.access_group<id = distinct[1]<>>
106
107// CHECK: #[[LOOP_ANNOT:.*]] = #llvm.loop_annotation<
108// CHECK-DAG: disableNonforced = false
109// CHECK-DAG: startLoc = #[[START_LOC_FUSED]]
110// CHECK-DAG: endLoc = #[[END_LOC_FUSED]]
111// CHECK-DAG: parallelAccesses = #[[GROUP1]], #[[GROUP2]]>
112#loopMD = #llvm.loop_annotation<disableNonforced = false,
113        mustProgress = true,
114        startLoc = #start_loc_fused,
115        endLoc = #end_loc_fused,
116        parallelAccesses = #group1, #group2>
117
118// CHECK: llvm.func @loop_annotation_with_locs
119llvm.func @loop_annotation_with_locs() {
120  // CHECK: llvm.br ^bb1 {loop_annotation = #[[LOOP_ANNOT]]
121  llvm.br ^bb1 {loop_annotation = #loopMD}
122^bb1:
123  llvm.return
124}
125