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