brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.6 KiB · b122f42 Raw
637 lines · plain
1// RUN: mlir-opt -convert-openmp-to-llvm -split-input-file %s | FileCheck %s2// RUN: mlir-opt -convert-to-llvm -split-input-file %s | FileCheck %s3// RUN: mlir-opt -convert-to-llvm="allow-pattern-rollback=0" -split-input-file %s | FileCheck %s4 5// CHECK-LABEL: llvm.func @foo(i64, i64)6func.func private @foo(index, index)7 8// CHECK-LABEL: llvm.func @critical_block_arg9func.func @critical_block_arg() {10  // CHECK: omp.critical11  omp.critical {12  // CHECK-NEXT: ^[[BB0:.*]](%[[ARG1:.*]]: i64, %[[ARG2:.*]]: i64):13  ^bb0(%arg1: index, %arg2: index):14    // CHECK-NEXT: llvm.call @foo(%[[ARG1]], %[[ARG2]]) : (i64, i64) -> ()15    func.call @foo(%arg1, %arg2) : (index, index) -> ()16    omp.terminator17  }18  return19}20 21// -----22 23// CHECK: omp.critical.declare @[[MUTEX:.*]] hint(contended, speculative)24omp.critical.declare @mutex hint(contended, speculative)25 26// CHECK: llvm.func @critical_declare27func.func @critical_declare() {28  // CHECK: omp.critical(@[[MUTEX]])29  omp.critical(@mutex) {30    omp.terminator31  }32  return33}34 35// -----36 37// CHECK-LABEL: llvm.func @master_block_arg38func.func @master_block_arg() {39  // CHECK: omp.master40  omp.master {41  // CHECK-NEXT: ^[[BB0:.*]](%[[ARG1:.*]]: i64, %[[ARG2:.*]]: i64):42  ^bb0(%arg1: index, %arg2: index):43    // CHECK-DAG: %[[CAST_ARG1:.*]] = builtin.unrealized_conversion_cast %[[ARG1]] : i64 to index44    // CHECK-DAG: %[[CAST_ARG2:.*]] = builtin.unrealized_conversion_cast %[[ARG2]] : i64 to index45    // CHECK-NEXT: "test.payload"(%[[CAST_ARG1]], %[[CAST_ARG2]]) : (index, index) -> ()46    "test.payload"(%arg1, %arg2) : (index, index) -> ()47    omp.terminator48  }49  return50}51 52// -----53 54// CHECK-LABEL: llvm.func @branch_loop55func.func @branch_loop() {56  %start = arith.constant 0 : index57  %end = arith.constant 0 : index58  // CHECK: omp.parallel59  omp.parallel {60    // CHECK-NEXT: llvm.br ^[[BB1:.*]](%{{[0-9]+}}, %{{[0-9]+}} : i64, i6461    cf.br ^bb1(%start, %end : index, index)62  // CHECK-NEXT: ^[[BB1]](%[[ARG1:[0-9]+]]: i64, %[[ARG2:[0-9]+]]: i64):{{.*}}63  ^bb1(%0: index, %1: index):64    // CHECK-NEXT: %[[CMP:[0-9]+]] = llvm.icmp "slt" %[[ARG1]], %[[ARG2]] : i6465    %2 = arith.cmpi slt, %0, %1 : index66    // CHECK-NEXT: llvm.cond_br %[[CMP]], ^[[BB2:.*]](%{{[0-9]+}}, %{{[0-9]+}} : i64, i64), ^[[BB3:.*]]67    cf.cond_br %2, ^bb2(%end, %end : index, index), ^bb368  // CHECK-NEXT: ^[[BB2]](%[[ARG3:[0-9]+]]: i64, %[[ARG4:[0-9]+]]: i64):69  ^bb2(%3: index, %4: index):70    // CHECK-NEXT: llvm.br ^[[BB1]](%[[ARG3]], %[[ARG4]] : i64, i64)71    cf.br ^bb1(%3, %4 : index, index)72  // CHECK-NEXT: ^[[BB3]]:73  ^bb3:74    omp.flush75    omp.barrier76    omp.taskwait77    omp.taskyield78    omp.terminator79  }80  return81}82 83// -----84 85// CHECK-LABEL: @wsloop86// CHECK: (%[[ARG0:.*]]: i64, %[[ARG1:.*]]: i64, %[[ARG2:.*]]: i64, %[[ARG3:.*]]: i64, %[[ARG4:.*]]: i64, %[[ARG5:.*]]: i64)87func.func @wsloop(%arg0: index, %arg1: index, %arg2: index, %arg3: index, %arg4: index, %arg5: index) {88  // CHECK: omp.parallel89  omp.parallel {90    // CHECK: omp.wsloop {91    "omp.wsloop"() ({92      // CHECK: omp.loop_nest (%[[ARG6:.*]], %[[ARG7:.*]]) : i64 = (%[[ARG0]], %[[ARG1]]) to (%[[ARG2]], %[[ARG3]]) step (%[[ARG4]], %[[ARG5]]) {93      omp.loop_nest (%arg6, %arg7) : index = (%arg0, %arg1) to (%arg2, %arg3) step (%arg4, %arg5) {94        // CHECK-DAG: %[[CAST_ARG6:.*]] = builtin.unrealized_conversion_cast %[[ARG6]] : i64 to index95        // CHECK-DAG: %[[CAST_ARG7:.*]] = builtin.unrealized_conversion_cast %[[ARG7]] : i64 to index96        // CHECK: "test.payload"(%[[CAST_ARG6]], %[[CAST_ARG7]]) : (index, index) -> ()97        "test.payload"(%arg6, %arg7) : (index, index) -> ()98        omp.yield99      }100    }) : () -> ()101    omp.terminator102  }103  return104}105 106// -----107 108// CHECK-LABEL: @atomic_write109// CHECK: (%[[ARG0:.*]]: !llvm.ptr)110// CHECK: %[[VAL0:.*]] = llvm.mlir.constant(1 : i32) : i32111// CHECK: omp.atomic.write %[[ARG0]] = %[[VAL0]] memory_order(relaxed) : !llvm.ptr, i32112func.func @atomic_write(%a: !llvm.ptr) -> () {113  %1 = arith.constant 1 : i32114  omp.atomic.write %a = %1 hint(none) memory_order(relaxed) : !llvm.ptr, i32115  return116}117 118// -----119 120// CHECK-LABEL: @atomic_read121// CHECK: (%[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr)122// CHECK: omp.atomic.read %[[ARG1]] = %[[ARG0]] hint(contended) memory_order(acquire) : !llvm.ptr123func.func @atomic_read(%a: !llvm.ptr, %b: !llvm.ptr) -> () {124  omp.atomic.read %b = %a memory_order(acquire) hint(contended) : !llvm.ptr, !llvm.ptr, i32125  return126}127 128// -----129 130func.func @atomic_update() {131  %0 = llvm.mlir.addressof @_QFsEc : !llvm.ptr132  omp.atomic.update   %0 : !llvm.ptr {133  ^bb0(%arg0: i32):134    %1 = arith.constant 1 : i32135    %2 = arith.addi %arg0, %1  : i32136    omp.yield(%2 : i32)137  }138  return139}140llvm.mlir.global internal @_QFsEc() : i32 {141  %0 = arith.constant 10 : i32142  llvm.return %0 : i32143}144 145// CHECK-LABEL: @atomic_update146// CHECK: %[[GLOBAL_VAR:.*]] = llvm.mlir.addressof @_QFsEc : !llvm.ptr147// CHECK: omp.atomic.update   %[[GLOBAL_VAR]] : !llvm.ptr {148// CHECK: ^bb0(%[[IN_VAL:.*]]: i32):149// CHECK:   %[[CONST_1:.*]] = llvm.mlir.constant(1 : i32) : i32150// CHECK:   %[[OUT_VAL:.*]] = llvm.add %[[IN_VAL]], %[[CONST_1]]  : i32151// CHECK:   omp.yield(%[[OUT_VAL]] : i32)152// CHECK: }153 154// -----155 156// CHECK-LABEL: @threadprivate157// CHECK: (%[[ARG0:.*]]: !llvm.ptr)158// CHECK: %[[VAL0:.*]] = omp.threadprivate %[[ARG0]] : !llvm.ptr -> !llvm.ptr159func.func @threadprivate(%a: !llvm.ptr) -> () {160  %1 = omp.threadprivate %a : !llvm.ptr -> !llvm.ptr161  return162}163 164// -----165 166// CHECK:      llvm.func @loop_nest_block_arg(%[[LOWER:.*]]: i32, %[[UPPER:.*]]: i32, %[[ITER:.*]]: i64) {167// CHECK:      omp.simd {168// CHECK-NEXT: omp.loop_nest (%[[ARG_0:.*]]) : i32 = (%[[LOWER]])169// CHECK-SAME: to (%[[UPPER]]) inclusive step (%[[LOWER]]) {170// CHECK:      llvm.br ^[[BB1:.*]](%[[ITER]] : i64)171// CHECK:        ^[[BB1]](%[[VAL_0:.*]]: i64):172// CHECK:          %[[VAL_1:.*]] = llvm.icmp "slt" %[[VAL_0]], %[[ITER]] : i64173// CHECK:          llvm.cond_br %[[VAL_1]], ^[[BB2:.*]], ^[[BB3:.*]]174// CHECK:        ^[[BB2]]:175// CHECK:          %[[VAL_2:.*]] = llvm.add %[[VAL_0]], %[[ITER]]  : i64176// CHECK:          llvm.br ^[[BB1]](%[[VAL_2]] : i64)177// CHECK:        ^[[BB3]]:178// CHECK:          omp.yield179func.func @loop_nest_block_arg(%val : i32, %ub : i32, %i : index) {180  omp.simd {181    omp.loop_nest (%arg0) : i32 = (%val) to (%ub) inclusive step (%val) {182      cf.br ^bb1(%i : index)183    ^bb1(%0: index):184      %1 = arith.cmpi slt, %0, %i : index185      cf.cond_br %1, ^bb2, ^bb3186    ^bb2:187      %2 = arith.addi %0, %i : index188      cf.br ^bb1(%2 : index)189    ^bb3:190      omp.yield191    }192  }193  return194}195 196// -----197 198// CHECK-LABEL: @task_depend199// CHECK:  (%[[ARG0:.*]]: !llvm.ptr) {200// CHECK:  omp.task depend(taskdependin -> %[[ARG0]] : !llvm.ptr) {201// CHECK:    omp.terminator202// CHECK:  }203// CHECK:   llvm.return204// CHECK: }205 206func.func @task_depend(%arg0: !llvm.ptr) {207  omp.task depend(taskdependin -> %arg0 : !llvm.ptr) {208    omp.terminator209  }210  return211}212 213// -----214 215// CHECK-LABEL: @_QPomp_target_data216// CHECK: (%[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr, %[[ARG2:.*]]: !llvm.ptr, %[[ARG3:.*]]: !llvm.ptr)217// CHECK: %[[MAP0:.*]] = omp.map.info var_ptr(%[[ARG0]] : !llvm.ptr, i32)   map_clauses(to) capture(ByRef) -> !llvm.ptr {name = ""}218// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr(%[[ARG1]] : !llvm.ptr, i32)   map_clauses(to) capture(ByRef) -> !llvm.ptr {name = ""}219// CHECK: %[[MAP2:.*]] = omp.map.info var_ptr(%[[ARG2]] : !llvm.ptr, i32)   map_clauses(always, storage) capture(ByRef) -> !llvm.ptr {name = ""}220// CHECK: omp.target_enter_data map_entries(%[[MAP0]], %[[MAP1]], %[[MAP2]] : !llvm.ptr, !llvm.ptr, !llvm.ptr)221// CHECK: %[[MAP3:.*]] = omp.map.info var_ptr(%[[ARG0]] : !llvm.ptr, i32)   map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}222// CHECK: %[[MAP4:.*]] = omp.map.info var_ptr(%[[ARG1]] : !llvm.ptr, i32)   map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}223// CHECK: %[[MAP5:.*]] = omp.map.info var_ptr(%[[ARG2]] : !llvm.ptr, i32)   map_clauses(storage) capture(ByRef) -> !llvm.ptr {name = ""}224// CHECK: %[[MAP6:.*]] = omp.map.info var_ptr(%[[ARG3]] : !llvm.ptr, i32)   map_clauses(always, delete) capture(ByRef) -> !llvm.ptr {name = ""}225// CHECK: omp.target_exit_data map_entries(%[[MAP3]], %[[MAP4]], %[[MAP5]], %[[MAP6]] : !llvm.ptr, !llvm.ptr, !llvm.ptr, !llvm.ptr)226 227llvm.func @_QPomp_target_data(%a : !llvm.ptr, %b : !llvm.ptr, %c : !llvm.ptr, %d : !llvm.ptr) {228  %0 = omp.map.info var_ptr(%a : !llvm.ptr, i32)   map_clauses(to) capture(ByRef) -> !llvm.ptr {name = ""}229  %1 = omp.map.info var_ptr(%b : !llvm.ptr, i32)   map_clauses(to) capture(ByRef) -> !llvm.ptr {name = ""}230  %2 = omp.map.info var_ptr(%c : !llvm.ptr, i32)   map_clauses(always, storage) capture(ByRef) -> !llvm.ptr {name = ""}231  omp.target_enter_data map_entries(%0, %1, %2 : !llvm.ptr, !llvm.ptr, !llvm.ptr) {}232  %3 = omp.map.info var_ptr(%a : !llvm.ptr, i32)   map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}233  %4 = omp.map.info var_ptr(%b : !llvm.ptr, i32)   map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}234  %5 = omp.map.info var_ptr(%c : !llvm.ptr, i32)   map_clauses(storage) capture(ByRef) -> !llvm.ptr {name = ""}235  %6 = omp.map.info var_ptr(%d : !llvm.ptr, i32)   map_clauses(always, delete) capture(ByRef) -> !llvm.ptr {name = ""}236  omp.target_exit_data map_entries(%3, %4, %5, %6 : !llvm.ptr, !llvm.ptr, !llvm.ptr, !llvm.ptr) {}237  llvm.return238}239 240// -----241 242// CHECK-LABEL: @_QPomp_target_data_region243// CHECK: (%[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr) {244// CHECK: %[[MAP_0:.*]] = omp.map.info var_ptr(%[[ARG0]] : !llvm.ptr, !llvm.array<1024 x i32>)  map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}245// CHECK: omp.target_data map_entries(%[[MAP_0]] : !llvm.ptr) {246// CHECK:           %[[VAL_1:.*]] = llvm.mlir.constant(10 : i32) : i32247// CHECK:           llvm.store %[[VAL_1]], %[[ARG1]] : i32, !llvm.ptr248// CHECK:           omp.terminator249// CHECK:         }250// CHECK:         llvm.return251 252llvm.func @_QPomp_target_data_region(%a : !llvm.ptr, %i : !llvm.ptr) {253  %1 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.array<1024 x i32>)   map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}254  omp.target_data map_entries(%1 : !llvm.ptr) {255    %2 = llvm.mlir.constant(10 : i32) : i32256    llvm.store %2, %i : i32, !llvm.ptr257    omp.terminator258  }259  llvm.return260}261 262// -----263 264// CHECK-LABEL:   llvm.func @_QPomp_target(265// CHECK:                             %[[ARG_0:.*]]: !llvm.ptr,266// CHECK:                             %[[ARG_1:.*]]: !llvm.ptr) {267// CHECK:           %[[VAL_0:.*]] = llvm.mlir.constant(64 : i32) : i32268// CHECK:           %[[MAP1:.*]] = omp.map.info var_ptr(%[[ARG_0]] : !llvm.ptr, !llvm.array<1024 x i32>)   map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}269// CHECK:           %[[MAP2:.*]] = omp.map.info var_ptr(%[[ARG_1]] : !llvm.ptr, i32)   map_clauses(implicit, storage) capture(ByCopy) -> !llvm.ptr {name = ""}270// CHECK:           omp.target thread_limit(%[[VAL_0]] : i32) map_entries(%[[MAP1]] -> %[[BB_ARG0:.*]], %[[MAP2]] -> %[[BB_ARG1:.*]] : !llvm.ptr, !llvm.ptr) {271// CHECK:             %[[VAL_1:.*]] = llvm.mlir.constant(10 : i32) : i32272// CHECK:             llvm.store %[[VAL_1]], %[[BB_ARG1]] : i32, !llvm.ptr273// CHECK:             omp.terminator274// CHECK:           }275// CHECK:           llvm.return276// CHECK:         }277 278llvm.func @_QPomp_target(%a : !llvm.ptr, %i : !llvm.ptr) {279  %0 = llvm.mlir.constant(64 : i32) : i32280  %1 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.array<1024 x i32>)   map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}281  %3 = omp.map.info var_ptr(%i : !llvm.ptr, i32)   map_clauses(implicit, storage) capture(ByCopy) -> !llvm.ptr {name = ""}282  omp.target   thread_limit(%0 : i32) map_entries(%1 -> %arg0, %3 -> %arg1 : !llvm.ptr, !llvm.ptr) {283    %2 = llvm.mlir.constant(10 : i32) : i32284    llvm.store %2, %arg1 : i32, !llvm.ptr285    omp.terminator286  }287  llvm.return288}289 290// -----291 292// CHECK-LABEL: @_QPsb293// CHECK: omp.sections294// CHECK: omp.section295// CHECK: llvm.br296// CHECK: llvm.icmp297// CHECK: llvm.cond_br298// CHECK: llvm.br299// CHECK: omp.terminator300// CHECK: omp.terminator301// CHECK: llvm.return302 303llvm.func @_QPsb() {304  %0 = llvm.mlir.constant(0 : i64) : i64305  %1 = llvm.mlir.constant(10 : i64) : i64306  %2 = llvm.mlir.constant(1 : i64) : i64307  omp.sections   {308    omp.section {309      llvm.br ^bb1(%1 : i64)310    ^bb1(%3: i64):  // 2 preds: ^bb0, ^bb2311      %4 = llvm.icmp "sgt" %3, %0 : i64312      llvm.cond_br %4, ^bb2, ^bb3313    ^bb2:  // pred: ^bb1314      %5 = llvm.sub %3, %2  : i64315      llvm.br ^bb1(%5 : i64)316    ^bb3:  // pred: ^bb1317      omp.terminator318    }319    omp.terminator320  }321  llvm.return322}323 324// -----325 326// CHECK:  omp.declare_reduction @eqv_reduction : i32 init327// CHECK:  ^bb0(%{{.*}}: i32):328// CHECK:    %[[TRUE:.*]] = llvm.mlir.constant(true) : i1329// CHECK:    %[[TRUE_EXT:.*]] = llvm.zext %[[TRUE]] : i1 to i32330// CHECK:    omp.yield(%[[TRUE_EXT]] : i32)331// CHECK:  } combiner {332// CHECK:  ^bb0(%[[ARG_1:.*]]: i32, %[[ARG_2:.*]]: i32):333// CHECK:    %[[ZERO:.*]] = llvm.mlir.constant(0 : i64) : i32334// CHECK:    %[[CMP_1:.*]] = llvm.icmp "ne" %[[ARG_1]], %[[ZERO]] : i32335// CHECK:    %[[CMP_2:.*]] = llvm.icmp "ne" %[[ARG_2]], %[[ZERO]] : i32336// CHECK:    %[[COMBINE_VAL:.*]] = llvm.icmp "eq" %[[CMP_1]], %[[CMP_2]] : i1337// CHECK:    %[[COMBINE_VAL_EXT:.*]] = llvm.zext %[[COMBINE_VAL]] : i1 to i32338// CHECK:    omp.yield(%[[COMBINE_VAL_EXT]] : i32)339// CHECK-LABEL:  @_QPsimple_reduction340// CHECK:    %[[RED_ACCUMULATOR:.*]] = llvm.alloca %{{.*}} x i32 {bindc_name = "x", uniq_name = "_QFsimple_reductionEx"} : (i64) -> !llvm.ptr341// CHECK:    omp.parallel342// CHECK:      omp.wsloop reduction(@eqv_reduction %{{.+}} -> %[[PRV:.+]] : !llvm.ptr)343// CHECK-NEXT:   omp.loop_nest {{.*}}{344// CHECK:          %[[LPRV:.+]] = llvm.load %[[PRV]] : !llvm.ptr -> i32345// CHECK:          %[[CMP:.+]] = llvm.icmp "eq" %{{.*}}, %[[LPRV]] : i32346// CHECK:          %[[ZEXT:.+]] = llvm.zext %[[CMP]] : i1 to i32347// CHECK:          llvm.store %[[ZEXT]], %[[PRV]] : i32, !llvm.ptr348// CHECK:          omp.yield349// CHECK:      omp.terminator350// CHECK:    llvm.return351 352omp.declare_reduction @eqv_reduction : i32 init {353^bb0(%arg0: i32):354  %0 = llvm.mlir.constant(true) : i1355  %1 = llvm.zext %0 : i1 to i32356  omp.yield(%1 : i32)357} combiner {358^bb0(%arg0: i32, %arg1: i32):359  %0 = llvm.mlir.constant(0 : i64) : i32360  %1 = llvm.icmp "ne" %arg0, %0 : i32361  %2 = llvm.icmp "ne" %arg1, %0 : i32362  %3 = llvm.icmp "eq" %1, %2 : i1363  %4 = llvm.zext %3 : i1 to i32364  omp.yield(%4 : i32)365}366llvm.func @_QPsimple_reduction(%arg0: !llvm.ptr {fir.bindc_name = "y"}) {367  %0 = llvm.mlir.constant(100 : i32) : i32368  %1 = llvm.mlir.constant(1 : i32) : i32369  %2 = llvm.mlir.constant(true) : i1370  %3 = llvm.mlir.constant(1 : i64) : i64371  %4 = llvm.alloca %3 x i32 {bindc_name = "x", uniq_name = "_QFsimple_reductionEx"} : (i64) -> !llvm.ptr372  %5 = llvm.zext %2 : i1 to i32373  llvm.store %5, %4 : i32, !llvm.ptr374  omp.parallel {375    %6 = llvm.alloca %3 x i32 {adapt.valuebyref, in_type = i32, operandSegmentSizes = array<i32: 0, 0>, pinned} : (i64) -> !llvm.ptr376    omp.wsloop reduction(@eqv_reduction %4 -> %prv : !llvm.ptr) {377      omp.loop_nest (%arg1) : i32 = (%1) to (%0) inclusive step (%1) {378        llvm.store %arg1, %6 : i32, !llvm.ptr379        %7 = llvm.load %6 : !llvm.ptr -> i32380        %8 = llvm.sext %7 : i32 to i64381        %9 = llvm.sub %8, %3  : i64382        %10 = llvm.getelementptr %arg0[0, %9] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.array<100 x i32>383        %11 = llvm.load %10 : !llvm.ptr -> i32384        %12 = llvm.load %prv : !llvm.ptr -> i32385        %13 = llvm.icmp "eq" %11, %12 : i32386        %14 = llvm.zext %13 : i1 to i32387        llvm.store %14, %prv : i32, !llvm.ptr388        omp.yield389      }390    }391    omp.terminator392  }393  llvm.return394}395 396// -----397 398// CHECK-LABEL:  @_QQmain399llvm.func @_QQmain() {400  %0 = llvm.mlir.constant(0 : index) : i64401  %1 = llvm.mlir.constant(5 : index) : i64402  %2 = llvm.mlir.constant(1 : index) : i64403  %3 = llvm.mlir.constant(1 : i64) : i64404  %4 = llvm.alloca %3 x i32 : (i64) -> !llvm.ptr405// CHECK: omp.taskgroup406  omp.taskgroup   {407    %5 = llvm.trunc %2 : i64 to i32408    llvm.br ^bb1(%5, %1 : i32, i64)409  ^bb1(%6: i32, %7: i64):  // 2 preds: ^bb0, ^bb2410    %8 = llvm.icmp "sgt" %7, %0 : i64411    llvm.cond_br %8, ^bb2, ^bb3412  ^bb2:  // pred: ^bb1413    llvm.store %6, %4 : i32, !llvm.ptr414// CHECK: omp.task415    omp.task   {416// CHECK: llvm.call @[[CALL_FUNC:.*]]({{.*}}) :417      llvm.call @_QFPdo_work(%4) : (!llvm.ptr) -> ()418// CHECK: omp.terminator419      omp.terminator420    }421    %9 = llvm.load %4 : !llvm.ptr -> i32422    %10 = llvm.add %9, %5  : i32423    %11 = llvm.sub %7, %2  : i64424    llvm.br ^bb1(%10, %11 : i32, i64)425  ^bb3:  // pred: ^bb1426    llvm.store %6, %4 : i32, !llvm.ptr427// CHECK: omp.terminator428    omp.terminator429  }430  llvm.return431}432// CHECK: @[[CALL_FUNC]]433llvm.func @_QFPdo_work(%arg0: !llvm.ptr {fir.bindc_name = "i"}) {434  llvm.return435}436 437// -----438 439// CHECK-LABEL:  @sub_440llvm.func @sub_() {441  %0 = llvm.mlir.constant(0 : index) : i64442  %1 = llvm.mlir.constant(1 : index) : i64443  %2 = llvm.mlir.constant(1 : i64) : i64444  %3 = llvm.alloca %2 x i32 {bindc_name = "i", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFsubEi"} : (i64) -> !llvm.ptr445// CHECK: omp.ordered.region446  omp.ordered.region {447    %4 = llvm.trunc %1 : i64 to i32448    llvm.br ^bb1(%4, %1 : i32, i64)449  ^bb1(%5: i32, %6: i64):  // 2 preds: ^bb0, ^bb2450    %7 = llvm.icmp "sgt" %6, %0 : i64451    llvm.cond_br %7, ^bb2, ^bb3452  ^bb2:  // pred: ^bb1453    llvm.store %5, %3 : i32, !llvm.ptr454    %8 = llvm.load %3 : !llvm.ptr -> i32455// CHECK: llvm.add456    %9 = arith.addi %8, %4 : i32457// CHECK: llvm.sub458    %10 = arith.subi %6, %1 : i64459    llvm.br ^bb1(%9, %10 : i32, i64)460  ^bb3:  // pred: ^bb1461    llvm.store %5, %3 : i32, !llvm.ptr462// CHECK: omp.terminator463    omp.terminator464  }465  llvm.return466}467 468// -----469 470// CHECK-LABEL:   llvm.func @_QPtarget_map_with_bounds(471// CHECK:           %[[ARG_0:.*]]: !llvm.ptr, %[[ARG_1:.*]]: !llvm.ptr, %[[ARG_2:.*]]: !llvm.ptr) {472// CHECK: %[[C_01:.*]] = llvm.mlir.constant(4 : index) : i64473// CHECK: %[[C_02:.*]] = llvm.mlir.constant(1 : index) : i64474// CHECK: %[[C_03:.*]] = llvm.mlir.constant(1 : index) : i64475// CHECK: %[[C_04:.*]] = llvm.mlir.constant(1 : index) : i64476// CHECK: %[[BOUNDS0:.*]] = omp.map.bounds   lower_bound(%[[C_02]] : i64) upper_bound(%[[C_01]] : i64) stride(%[[C_04]] : i64) start_idx(%[[C_04]] : i64)477// CHECK: %[[MAP0:.*]] = omp.map.info var_ptr(%[[ARG_1]] : !llvm.ptr, !llvm.array<10 x i32>)   map_clauses(tofrom) capture(ByRef) bounds(%[[BOUNDS0]]) -> !llvm.ptr {name = ""}478// CHECK: %[[C_11:.*]] = llvm.mlir.constant(4 : index) : i64479// CHECK: %[[C_12:.*]] = llvm.mlir.constant(1 : index) : i64480// CHECK: %[[C_13:.*]] = llvm.mlir.constant(1 : index) : i64481// CHECK: %[[C_14:.*]] = llvm.mlir.constant(1 : index) : i64482// CHECK: %[[BOUNDS1:.*]] = omp.map.bounds   lower_bound(%[[C_12]] : i64) upper_bound(%[[C_11]] : i64) stride(%[[C_14]] : i64) start_idx(%[[C_14]] : i64)483// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr(%[[ARG_2]] : !llvm.ptr, !llvm.array<10 x i32>)   map_clauses(tofrom) capture(ByRef) bounds(%[[BOUNDS1]]) -> !llvm.ptr {name = ""}484// CHECK: omp.target   map_entries(%[[MAP0]] -> %[[BB_ARG0:.*]], %[[MAP1]]  -> %[[BB_ARG1:.*]] : !llvm.ptr, !llvm.ptr) {485// CHECK:   omp.terminator486// CHECK: }487// CHECK: llvm.return488// CHECK:}489 490llvm.func @_QPtarget_map_with_bounds(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {491  %0 = llvm.mlir.constant(4 : index) : i64492  %1 = llvm.mlir.constant(1 : index) : i64493  %2 = llvm.mlir.constant(1 : index) : i64494  %3 = llvm.mlir.constant(1 : index) : i64495  %4 = omp.map.bounds   lower_bound(%1 : i64) upper_bound(%0 : i64) stride(%3 : i64) start_idx(%3 : i64)496  %5 = omp.map.info var_ptr(%arg1 : !llvm.ptr, !llvm.array<10 x i32>)   map_clauses(tofrom) capture(ByRef) bounds(%4) -> !llvm.ptr {name = ""}497  %6 = llvm.mlir.constant(4 : index) : i64498  %7 = llvm.mlir.constant(1 : index) : i64499  %8 = llvm.mlir.constant(1 : index) : i64500  %9 = llvm.mlir.constant(1 : index) : i64501  %10 = omp.map.bounds   lower_bound(%7 : i64) upper_bound(%6 : i64) stride(%9 : i64) start_idx(%9 : i64)502  %11 = omp.map.info var_ptr(%arg2 : !llvm.ptr, !llvm.array<10 x i32>)   map_clauses(tofrom) capture(ByRef) bounds(%10) -> !llvm.ptr {name = ""}503  omp.target   map_entries(%5 -> %arg3, %11 -> %arg4: !llvm.ptr, !llvm.ptr) {504    omp.terminator505  }506  llvm.return507}508 509// -----510 511// CHECK: omp.private {type = private} @x.privatizer : !llvm.struct<{{.*}}> init {512omp.private {type = private} @x.privatizer : memref<?xf32> init {513// CHECK: ^bb0(%arg0: !llvm.struct<{{.*}}>, %arg1: !llvm.struct<{{.*}}>):514^bb0(%arg0: memref<?xf32>, %arg1: memref<?xf32>):515  // CHECK: omp.yield(%arg0 : !llvm.struct<{{.*}}>)516  omp.yield(%arg0 : memref<?xf32>)517}518 519// -----520 521// CHECK: omp.private {type = firstprivate} @y.privatizer : i64 copy {522omp.private {type = firstprivate} @y.privatizer : index copy {523// CHECK: ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):524^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):525  // CHECK: omp.yield(%arg0 : !llvm.ptr)526  omp.yield(%arg0 : !llvm.ptr)527}528 529// -----530 531// CHECK-LABEL: llvm.func @omp_cancel_cancellation_point()532func.func @omp_cancel_cancellation_point() -> () {533  omp.parallel {534    // CHECK: omp.cancel cancellation_construct_type(parallel)535    omp.cancel cancellation_construct_type(parallel)536    // CHECK: omp.cancellation_point cancellation_construct_type(parallel)537    omp.cancellation_point cancellation_construct_type(parallel)538    omp.terminator539  }540  return541}542 543// -----544 545// CHECK-LABEL: llvm.func @omp_distribute(546// CHECK-SAME:  %[[ARG0:.*]]: i64)547func.func @omp_distribute(%arg0 : index) -> () {548  // CHECK: omp.distribute dist_schedule_static dist_schedule_chunk_size(%[[ARG0]] : i64) {549  omp.distribute dist_schedule_static dist_schedule_chunk_size(%arg0 : index) {550    omp.loop_nest (%iv) : index = (%arg0) to (%arg0) step (%arg0) {551      omp.yield552    }553  }554  return555}556 557// -----558 559// CHECK-LABEL: llvm.func @omp_teams(560// CHECK-SAME:  %[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr, %[[ARG2:.*]]: i64)561func.func @omp_teams(%arg0 : memref<i32>) -> () {562  // CHECK: omp.teams allocate(%{{.*}} : !llvm.struct<(ptr, ptr, i64)> -> %{{.*}} : !llvm.struct<(ptr, ptr, i64)>)563  omp.teams allocate(%arg0 : memref<i32> -> %arg0 : memref<i32>) {564    omp.terminator565  }566  return567}568 569// -----570 571// CHECK-LABEL: llvm.func @omp_ordered(572// CHECK-SAME:  %[[ARG0:.*]]: i64)573func.func @omp_ordered(%arg0 : index) -> () {574  omp.wsloop ordered(1) {575    omp.loop_nest (%iv) : index = (%arg0) to (%arg0) step (%arg0) {576      // CHECK: omp.ordered depend_vec(%[[ARG0]] : i64) {doacross_num_loops = 1 : i64}577      omp.ordered depend_vec(%arg0 : index) {doacross_num_loops = 1 : i64}578      omp.yield579    }580  }581  return582}583 584// -----585 586// CHECK-LABEL: @omp_taskloop(587// CHECK-SAME:  %[[ARG0:.*]]: i64, %[[ARG1:.*]]: !llvm.ptr, %[[ARG2:.*]]: !llvm.ptr, %[[ARG3:.*]]: i64)588func.func @omp_taskloop(%arg0: index, %arg1 : memref<i32>) {589  // CHECK: omp.parallel {590  omp.parallel {591    // CHECK: omp.taskloop allocate(%{{.*}} : !llvm.struct<(ptr, ptr, i64)> -> %{{.*}} : !llvm.struct<(ptr, ptr, i64)>) {592    omp.taskloop allocate(%arg1 : memref<i32> -> %arg1 : memref<i32>) {593      // CHECK: omp.loop_nest (%[[IV:.*]]) : i64 = (%[[ARG0]]) to (%[[ARG0]]) step (%[[ARG0]]) {594      omp.loop_nest (%iv) : index = (%arg0) to (%arg0) step (%arg0) {595        // CHECK-DAG: %[[CAST_IV:.*]] = builtin.unrealized_conversion_cast %[[IV]] : i64 to index596        // CHECK: "test.payload"(%[[CAST_IV]]) : (index) -> ()597        "test.payload"(%iv) : (index) -> ()598        omp.yield599      }600    }601    omp.terminator602  }603  return604}605 606// -----607 608// CHECK-LABEL: omp.declare_mapper @my_mapper : !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)> {609omp.declare_mapper @my_mapper : !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)> {610^bb0(%arg0: !llvm.ptr):611  %0 = llvm.mlir.constant(0 : i32) : i32612  %1 = llvm.getelementptr %arg0[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>613  %2 = omp.map.info var_ptr(%1 : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = "var%data"}614  %3 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>) map_clauses(tofrom) capture(ByRef) members(%2 : [0] : !llvm.ptr) -> !llvm.ptr {name = "var", partial_map = true}615  // CHECK: omp.declare_mapper.info map_entries(%{{.*}}, %{{.*}} : !llvm.ptr, !llvm.ptr)616  omp.declare_mapper.info map_entries(%3, %2 : !llvm.ptr, !llvm.ptr)617}618 619// CHECK-LABEL: llvm.func @omp_dist_schedule(%arg0: i32) {620func.func @omp_dist_schedule(%arg0: i32) {621  %c1_i32 = arith.constant 1 : i32622  // CHECK: %1 = llvm.mlir.constant(1024 : i32) : i32623  %c1024_i32 = arith.constant 1024 : i32624  %c16_i32 = arith.constant 16 : i32625  %c8_i32 = arith.constant 8 : i32626  omp.teams num_teams( to %c8_i32 : i32) thread_limit(%c16_i32 : i32) {627    // CHECK: omp.distribute dist_schedule_static dist_schedule_chunk_size(%1 : i32) {628    omp.distribute dist_schedule_static dist_schedule_chunk_size(%c1024_i32 : i32) {629      omp.loop_nest (%arg1) : i32 = (%c1_i32) to (%arg0) inclusive step (%c1_i32) {630        omp.terminator631      }632    }633    omp.terminator634  }635  return636}637