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