375 lines · plain
1; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s2 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_group9define void @access_group(ptr %arg1) {10 ; CHECK: access_groups = [#[[$GROUP0]], #[[$GROUP1]]]11 %1 = load i32, ptr %arg1, !llvm.access.group !012 ; CHECK: access_groups = [#[[$GROUP2]], #[[$GROUP0]]]13 %2 = load i32, ptr %arg1, !llvm.access.group !114 ; CHECK: access_groups = [#[[$GROUP3]]]15 %3 = load i32, ptr %arg1, !llvm.access.group !216 ret void17}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_ops29define 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 !032 ; CHECK: llvm.store {{.*}}access_groups =33 store i32 %1, ptr %arg1, !llvm.access.group !034 ; CHECK: llvm.atomicrmw {{.*}}access_groups =35 %2 = atomicrmw fmax ptr %arg1, float %arg2 acquire, !llvm.access.group !036 ; CHECK: llvm.cmpxchg {{.*}}access_groups =37 %3 = cmpxchg ptr %arg1, i32 %arg3, i32 %arg4 monotonic seq_cst, !llvm.access.group !038 ; 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 !040 ; CHECK: "llvm.intr.memset"{{.*}}access_groups =41 call void @llvm.memset.p0.i32(ptr %arg1, i8 42, i32 4, i1 false), !llvm.access.group !042 ; CHECK: llvm.call{{.*}}access_groups =43 call void @foo(ptr %arg1), !llvm.access.group !044 ret void45}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: @simple60define void @simple(i64 %n, ptr %A) {61entry:62; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}63 br label %end, !llvm.loop !164end:65 ret void66}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: @vectorize80define void @vectorize(i64 %n, ptr %A) {81entry:82; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}83 br label %end, !llvm.loop !184end:85 ret void86}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: @interleave106define void @interleave(i64 %n, ptr %A) {107entry:108; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}109 br label %end, !llvm.loop !1110end:111 ret void112}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: @unroll124define void @unroll(i64 %n, ptr %A) {125entry:126; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}127 br label %end, !llvm.loop !1128end:129 ret void130}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_disable150define void @unroll_disable(i64 %n, ptr %A) {151entry:152; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}153 br label %end, !llvm.loop !1154end:155 ret void156}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_jam168define void @unroll_and_jam(i64 %n, ptr %A) {169entry:170; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}171 br label %end, !llvm.loop !1172end:173 ret void174}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: @licm194define void @licm(i64 %n, ptr %A) {195entry:196; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}197 br label %end, !llvm.loop !1198end:199 ret void200}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: @distribute213define void @distribute(i64 %n, ptr %A) {214entry:215; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}216 br label %end, !llvm.loop !1217end:218 ret void219}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: @pipeline237define void @pipeline(i64 %n, ptr %A) {238entry:239; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}240 br label %end, !llvm.loop !1241end:242 ret void243}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: @peeled255define void @peeled(i64 %n, ptr %A) {256entry:257; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}258 br label %end, !llvm.loop !1259end:260 ret void261}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: @unswitched272define void @unswitched(i64 %n, ptr %A) {273entry:274; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}275 br label %end, !llvm.loop !1276end:277 ret void278}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_accesses289define void @parallel_accesses(ptr %arg) {290entry:291 %0 = load i32, ptr %arg, !llvm.access.group !0292; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}293 br label %end, !llvm.loop !1294end:295 ret void296}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_accesses309define void @multiple_parallel_accesses(ptr %arg) {310entry:311 %0 = load i32, ptr %arg, !llvm.access.group !0312 %1 = load i32, ptr %arg, !llvm.access.group !3313; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}314 br label %end, !llvm.loop !1315end:316 ret void317}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_group328 329; CHECK-LABEL: @unused_parallel_access330define void @unused_parallel_access(ptr %arg) {331entry:332 %0 = load i32, ptr %arg, !llvm.access.group !0333 br label %end, !llvm.loop !1334end:335 ret void336}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 = true352; CHECK-SAME: startLoc = #[[start_loc_fused]]353; CHECK-SAME: endLoc = #[[end_loc_fused]]354 355; CHECK-LABEL: @loop_locs356define void @loop_locs(i64 %n, ptr %A) {357entry:358; CHECK: llvm.br ^{{.*}} {loop_annotation = #[[$ANNOT_ATTR]]}359 br label %end, !llvm.loop !6360end:361 ret void362}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