[flang] Accept polymorphic component element in storage_size
[llvm-project.git] / mlir / test / Target / LLVMIR / loop-metadata.mlir
blobc0ea4b7812c4690fdece51efd2e4d9af89675b3b
1 // RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
3 // CHECK-LABEL: @disableNonForced
4 llvm.func @disableNonForced() {
5   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
6   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<disableNonforced = true>}
7 ^bb1:
8   llvm.return
11 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
12 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.disable_nonforced"}
14 // -----
16 // CHECK-LABEL: @mustprogress
17 llvm.func @mustprogress() {
18   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
19   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<mustProgress = true>}
20 ^bb1:
21   llvm.return
24 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
25 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.mustprogress"}
27 // -----
29 // CHECK-LABEL: @isvectorized
30 llvm.func @isvectorized() {
31   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
32   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<isVectorized = true>}
33 ^bb1:
34   llvm.return
37 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
38 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.isvectorized", i32 1}
40 // -----
42 #followup = #llvm.loop_annotation<disableNonforced = true>
44 // CHECK-LABEL: @vectorizeOptions
45 llvm.func @vectorizeOptions() {
46   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
47   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<vectorize = <
48     disable = false, predicateEnable = true, scalableEnable = false, width = 16 : i32, 
49     followupVectorized = #followup, followupEpilogue = #followup, followupAll = #followup>
50   >}
51 ^bb1:
52   llvm.return
55 // CHECK-DAG: ![[NON_FORCED:[0-9]+]] = !{!"llvm.loop.disable_nonforced"}
56 // CHECK-DAG: ![[FOLLOWUP:[0-9]+]] = distinct !{![[FOLLOWUP]], ![[NON_FORCED]]}
57 // CHECK-DAG: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
58 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.enable", i1 true}
59 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
60 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.scalable.enable", i1 false}
61 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.width", i32 16}
62 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.followup_vectorized", ![[FOLLOWUP]]}
63 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.followup_epilogue", ![[FOLLOWUP]]}
64 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.followup_all", ![[FOLLOWUP]]}
66 // -----
68 // CHECK-LABEL: @interleaveOptions
69 llvm.func @interleaveOptions() {
70   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
71   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<interleave = <count = 32 : i32>>}
72 ^bb1:
73   llvm.return
76 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], ![[INTERLEAVE_NODE:[0-9]+]]}
77 // CHECK: ![[INTERLEAVE_NODE]] = !{!"llvm.loop.interleave.count", i32 32}
79 // -----
81 #followup = #llvm.loop_annotation<disableNonforced = true>
83 // CHECK-LABEL: @unrollOptions
84 llvm.func @unrollOptions() {
85   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
86   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<unroll = <
87     disable = true, count = 64 : i32, runtimeDisable = false, full = false,
88     followupUnrolled = #followup, followupRemainder = #followup, followupAll = #followup>
89   >}
90 ^bb1:
91   llvm.return
94 // CHECK-DAG: ![[NON_FORCED:[0-9]+]] = !{!"llvm.loop.disable_nonforced"}
95 // CHECK-DAG: ![[FOLLOWUP:[0-9]+]] = distinct !{![[FOLLOWUP]], ![[NON_FORCED]]}
96 // CHECK-DAG: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
97 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.disable"}
98 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.count", i32 64}
99 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.runtime.disable", i1 false}
100 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.followup_unrolled", ![[FOLLOWUP]]}
101 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.followup_remainder", ![[FOLLOWUP]]}
102 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll.followup_all", ![[FOLLOWUP]]}
104 // -----
106 // CHECK-LABEL: @unrollOptions2
107 llvm.func @unrollOptions2() {
108   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
109   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<unroll = <disable = false, full = true>>}
110 ^bb1:
111   llvm.return
114 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}} 
115 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.unroll.enable"}
116 // CHECK-DAG: ![[VEC_NODE2:[0-9]+]] = !{!"llvm.loop.unroll.full"}
118 // -----
120 #followup = #llvm.loop_annotation<disableNonforced = true>
122 // CHECK-LABEL: @unrollAndJamOptions
123 llvm.func @unrollAndJamOptions() {
124   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
125   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<unrollAndJam = <
126     disable = false, count = 8 : i32, followupOuter = #followup, followupInner = #followup,
127     followupRemainderOuter = #followup, followupRemainderInner = #followup, followupAll = #followup>
128   >}
129 ^bb1:
130   llvm.return
133 // CHECK-DAG: ![[NON_FORCED:[0-9]+]] = !{!"llvm.loop.disable_nonforced"}
134 // CHECK-DAG: ![[FOLLOWUP:[0-9]+]] = distinct !{![[FOLLOWUP]], ![[NON_FORCED]]}
135 // CHECK-DAG: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
136 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.enable"}
137 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.count", i32 8}
138 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.followup_outer", ![[FOLLOWUP]]}
139 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.followup_inner", ![[FOLLOWUP]]}
140 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.followup_remainder_outer", ![[FOLLOWUP]]}
141 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.followup_remainder_inner", ![[FOLLOWUP]]}
142 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.unroll_and_jam.followup_all", ![[FOLLOWUP]]}
144 // -----
146 // CHECK-LABEL: @licmOptions
147 llvm.func @licmOptions() {
148   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
149   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<licm = <disable = false, versioningDisable = true>>}
150 ^bb1:
151   llvm.return
154 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
155 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.licm_versioning.disable"}
157 // -----
159 // CHECK-LABEL: @licmOptions2
160 llvm.func @licmOptions2() {
161   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
162   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<licm = <disable = true, versioningDisable = false>>}
163 ^bb1:
164   llvm.return
167 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
168 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.licm.disable"}
170 // -----
172 #followup = #llvm.loop_annotation<disableNonforced = true>
174 // CHECK-LABEL: @distributeOptions
175 llvm.func @distributeOptions() {
176   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
177   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<distribute = <
178     disable = true, followupCoincident = #followup, followupSequential = #followup,
179     followupFallback = #followup, followupAll = #followup>
180   >}
181 ^bb1:
182   llvm.return
185 // CHECK-DAG: ![[NON_FORCED:[0-9]+]] = !{!"llvm.loop.disable_nonforced"}
186 // CHECK-DAG: ![[FOLLOWUP:[0-9]+]] = distinct !{![[FOLLOWUP]], ![[NON_FORCED]]}
187 // CHECK-DAG: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
188 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.distribute.enable", i1 false}
189 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.distribute.followup_coincident", ![[FOLLOWUP]]}
190 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.distribute.followup_sequential", ![[FOLLOWUP]]}
191 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.distribute.followup_fallback", ![[FOLLOWUP]]}
192 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.distribute.followup_all", ![[FOLLOWUP]]}
194 // -----
196 // CHECK-LABEL: @pipelineOptions
197 llvm.func @pipelineOptions() {
198   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
199   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<pipeline = <disable = false, initiationinterval = 1 : i32>>}
200 ^bb1:
201   llvm.return
204 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}}
205 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.pipeline.disable", i1 false}
206 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.pipeline.initiationinterval", i32 1}
208 // -----
210 // CHECK-LABEL: @peeledOptions
211 llvm.func @peeledOptions() {
212   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
213   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<peeled = <count = 3 : i32>>}
214 ^bb1:
215   llvm.return
218 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
219 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.peeled.count", i32 3}
221 // -----
223 // CHECK-LABEL: @unswitchOptions
224 llvm.func @unswitchOptions() {
225   // CHECK: br {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
226   llvm.br ^bb1 {loop_annotation = #llvm.loop_annotation<unswitch = <partialDisable = true>>}
227 ^bb1:
228   llvm.return
231 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}}
232 // CHECK-DAG: ![[VEC_NODE0:[0-9]+]] = !{!"llvm.loop.unswitch.partial.disable"}
234 // -----
236 // CHECK-LABEL: @loopOptions
237 llvm.func @loopOptions(%arg1 : i32, %arg2 : i32) {
238     %0 = llvm.mlir.constant(0 : i32) : i32
239     %4 = llvm.alloca %arg1 x i32 : (i32) -> (!llvm.ptr<i32>)
240     llvm.br ^bb3(%0 : i32)
241   ^bb3(%1: i32):
242     %2 = llvm.icmp "slt" %1, %arg1 : i32
243     // CHECK: br i1 {{.*}} !llvm.loop ![[LOOP_NODE:[0-9]+]]
244     llvm.cond_br %2, ^bb4, ^bb5 {loop_annotation = #llvm.loop_annotation<
245           licm = <disable = true>,
246           interleave = <count = 1>,
247           unroll = <disable = true>, pipeline = <disable = true, initiationinterval = 2>,
248           parallelAccesses = @metadata::@group1, @metadata::@group2>}
249   ^bb4:
250     %3 = llvm.add %1, %arg2  : i32
251     // CHECK: = load i32, ptr %{{.*}} !llvm.access.group ![[ACCESS_GROUPS_NODE:[0-9]+]]
252     %5 = llvm.load %4 { access_groups = [@metadata::@group1, @metadata::@group2] } : !llvm.ptr<i32>
253     // CHECK: br label {{.*}} !llvm.loop ![[LOOP_NODE]]
254     llvm.br ^bb3(%3 : i32) {loop_annotation = #llvm.loop_annotation<
255           licm = <disable = true>,
256           interleave = <count = 1>,
257           unroll = <disable = true>, pipeline = <disable = true, initiationinterval = 2>,
258           parallelAccesses = @metadata::@group1, @metadata::@group2>}
260   ^bb5:
261     llvm.return
264 llvm.metadata @metadata {
265   llvm.access_group @group1
266   llvm.access_group @group2
269 // CHECK: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}       
270 // CHECK-DAG: ![[PA_NODE:[0-9]+]] = !{!"llvm.loop.parallel_accesses", ![[GROUP_NODE1:[0-9]+]], ![[GROUP_NODE2:[0-9]+]]}
271 // CHECK-DAG: ![[GROUP_NODE1:[0-9]+]] = distinct !{}
272 // CHECK-DAG: ![[GROUP_NODE2:[0-9]+]] = distinct !{}
273 // CHECK-DAG: ![[UNROLL_DISABLE_NODE:[0-9]+]] = !{!"llvm.loop.unroll.disable"}
274 // CHECK-DAG: ![[LICM_DISABLE_NODE:[0-9]+]] = !{!"llvm.licm.disable"}
275 // CHECK-DAG: ![[INTERLEAVE_NODE:[0-9]+]] = !{!"llvm.loop.interleave.count", i32 1}
276 // CHECK-DAG: ![[PIPELINE_DISABLE_NODE:[0-9]+]] = !{!"llvm.loop.pipeline.disable", i1 true}
277 // CHECK-DAG: ![[II_NODE:[0-9]+]] = !{!"llvm.loop.pipeline.initiationinterval", i32 2}
278 // CHECK-DAG: ![[ACCESS_GROUPS_NODE:[0-9]+]] = !{![[GROUP_NODE1]], ![[GROUP_NODE2]]}