158 lines · plain
1// RUN: mlir-opt --mlir-disable-threading -omp-offload-privatization-prepare --split-input-file %s | FileCheck %s2 3module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little", "dlti.mangling_mode" = "e", "dlti.legal_int_widths" = array<i32: 8, 16, 32, 64>, "dlti.stack_alignment" = 128 : i64>} {4 llvm.func @free(!llvm.ptr)5 llvm.func @malloc(i64) -> !llvm.ptr6 7 omp.private {type = firstprivate} @private_eye : i32 copy {8 ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):9 %0 = llvm.load %arg0 : !llvm.ptr -> i3210 llvm.store %0, %arg1 : i32, !llvm.ptr11 omp.yield(%arg1 : !llvm.ptr)12 }13 omp.private {type = firstprivate} @boxchar_firstprivate : !llvm.struct<(ptr, i64)> init {14 ^bb0(%arg0: !llvm.struct<(ptr, i64)>, %arg1: !llvm.struct<(ptr, i64)>):15 %0 = llvm.extractvalue %arg0[0] : !llvm.struct<(ptr, i64)>16 %1 = llvm.extractvalue %arg0[1] : !llvm.struct<(ptr, i64)>17 %8 = llvm.call @malloc(%1) {bindc_name = "", uniq_name = ""} : (i64) -> !llvm.ptr18 %9 = llvm.mlir.undef : !llvm.struct<(ptr, i64)>19 %10 = llvm.insertvalue %8, %9[0] : !llvm.struct<(ptr, i64)>20 %11 = llvm.insertvalue %1, %10[1] : !llvm.struct<(ptr, i64)>21 omp.yield(%11 : !llvm.struct<(ptr, i64)>)22 } copy {23 ^bb0(%arg0: !llvm.struct<(ptr, i64)>, %arg1: !llvm.struct<(ptr, i64)>):24 %3 = llvm.extractvalue %arg0[0] : !llvm.struct<(ptr, i64)>25 %4 = llvm.extractvalue %arg0[1] : !llvm.struct<(ptr, i64)>26 %5 = llvm.extractvalue %arg1[0] : !llvm.struct<(ptr, i64)>27 %6 = llvm.extractvalue %arg1[1] : !llvm.struct<(ptr, i64)>28 %7 = llvm.icmp "slt" %6, %4 : i6429 %8 = llvm.select %7, %6, %4 : i1, i6430 "llvm.intr.memmove"(%5, %3, %8) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()31 omp.yield(%arg1 : !llvm.struct<(ptr, i64)>)32 } dealloc {33 ^bb0(%arg0: !llvm.struct<(ptr, i64)>):34 %0 = llvm.extractvalue %arg0[0] : !llvm.struct<(ptr, i64)>35 %1 = llvm.extractvalue %arg0[1] : !llvm.struct<(ptr, i64)>36 llvm.call @free(%0) : (!llvm.ptr) -> ()37 omp.yield38 }39 40 llvm.func @target_boxchar_(%arg0: !llvm.ptr {fir.bindc_name = "l"}) attributes {fir.internal_name = "_QPtarget_boxchar", frame_pointer = #llvm.framePointerKind<all>, target_cpu = "x86-64"} {41 %0 = llvm.mlir.constant(1 : i64) : i6442 %1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr43 %2 = llvm.mlir.constant(1 : i64) : i6444 %3 = llvm.alloca %2 x !llvm.struct<(ptr, i64)> : (i64) -> !llvm.ptr45 %4 = llvm.mlir.constant(1 : index) : i6446 %5 = llvm.mlir.constant(0 : index) : i6447 %6 = llvm.mlir.constant(0 : i32) : i3248 %7 = llvm.mlir.constant(1 : i64) : i6449 %8 = llvm.mlir.constant(1 : i64) : i6450 %9 = llvm.load %arg0 : !llvm.ptr -> i3251 %10 = llvm.icmp "sgt" %9, %6 : i3252 %11 = llvm.select %10, %9, %6 : i1, i3253 %12 = llvm.mlir.constant(1 : i64) : i6454 %13 = llvm.sext %11 : i32 to i6455 %14 = llvm.alloca %13 x i8 {bindc_name = "char_var"} : (i64) -> !llvm.ptr56 %15 = llvm.mlir.undef : !llvm.struct<(ptr, i64)>57 %16 = llvm.sext %11 : i32 to i6458 %17 = llvm.insertvalue %14, %15[0] : !llvm.struct<(ptr, i64)>59 %18 = llvm.insertvalue %16, %17[1] : !llvm.struct<(ptr, i64)>60 llvm.store %18, %3 : !llvm.struct<(ptr, i64)>, !llvm.ptr61 %19 = llvm.load %3 : !llvm.ptr -> !llvm.struct<(ptr, i64)>62 %20 = llvm.extractvalue %19[0] : !llvm.struct<(ptr, i64)>63 %21 = llvm.extractvalue %19[1] : !llvm.struct<(ptr, i64)>64 %22 = llvm.sub %21, %4 : i6465 %23 = omp.map.bounds lower_bound(%5 : i64) upper_bound(%22 : i64) extent(%21 : i64) stride(%4 : i64) start_idx(%5 : i64) {stride_in_bytes = true}66 %24 = llvm.getelementptr %3[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64)>67 %25 = omp.map.info var_ptr(%3 : !llvm.ptr, i8) map_clauses(implicit, to) capture(ByRef) var_ptr_ptr(%24 : !llvm.ptr) bounds(%23) -> !llvm.ptr68 %26 = omp.map.info var_ptr(%3 : !llvm.ptr, !llvm.struct<(ptr, i64)>) map_clauses(to) capture(ByRef) members(%25 : [0] : !llvm.ptr) -> !llvm.ptr69 %27 = omp.map.info var_ptr(%1 : !llvm.ptr, i32) map_clauses(to) capture(ByCopy) -> !llvm.ptr70 omp.target nowait map_entries(%26 -> %arg1, %27 -> %arg2, %25 -> %arg3 : !llvm.ptr, !llvm.ptr, !llvm.ptr) private(@boxchar_firstprivate %18 -> %arg4 [map_idx=0], @private_eye %1 -> %arg5 [map_idx=1] : !llvm.struct<(ptr, i64)>, !llvm.ptr) {71 omp.terminator72 }73 llvm.return74 }75}76// CHECK-LABEL: llvm.func @target_boxchar_(77// CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr {fir.bindc_name = "l"}) attributes {fir.internal_name = "_QPtarget_boxchar", frame_pointer = #llvm.framePointerKind<all>, target_cpu = "x86-64"} {78// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i6479// CHECK: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr80// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i64) : i6481// CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(16 : i64) : i6482// CHECK: %[[HEAP0:.*]] = llvm.call @malloc(%[[VAL_3]]) : (i64) -> !llvm.ptr83// CHECK: %[[VAL_5:.*]] = llvm.alloca %[[VAL_2]] x !llvm.struct<(ptr, i64)> : (i64) -> !llvm.ptr84// CHECK: %[[VAL_6:.*]] = llvm.mlir.constant(1 : index) : i6485// CHECK: %[[VAL_7:.*]] = llvm.mlir.constant(0 : index) : i6486// CHECK: %[[VAL_8:.*]] = llvm.mlir.constant(0 : i32) : i3287// CHECK: %[[VAL_9:.*]] = llvm.mlir.constant(1 : i64) : i6488// CHECK: %[[VAL_10:.*]] = llvm.mlir.constant(1 : i64) : i6489// CHECK: %[[VAL_11:.*]] = llvm.load %[[ARG0]] : !llvm.ptr -> i3290// CHECK: %[[VAL_12:.*]] = llvm.icmp "sgt" %[[VAL_11]], %[[VAL_8]] : i3291// CHECK: %[[VAL_13:.*]] = llvm.select %[[VAL_12]], %[[VAL_11]], %[[VAL_8]] : i1, i3292// CHECK: %[[VAL_14:.*]] = llvm.mlir.constant(1 : i64) : i6493// CHECK: %[[VAL_15:.*]] = llvm.sext %[[VAL_13]] : i32 to i6494// CHECK: %[[VAL_16:.*]] = llvm.alloca %[[VAL_15]] x i8 {bindc_name = "char_var"} : (i64) -> !llvm.ptr95// CHECK: %[[VAL_17:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i64)>96// CHECK: %[[VAL_18:.*]] = llvm.sext %[[VAL_13]] : i32 to i6497// CHECK: %[[VAL_19:.*]] = llvm.insertvalue %[[VAL_16]], %[[VAL_17]][0] : !llvm.struct<(ptr, i64)>98// CHECK: %[[VAL_20:.*]] = llvm.insertvalue %[[VAL_18]], %[[VAL_19]][1] : !llvm.struct<(ptr, i64)>99// CHECK: llvm.store %[[VAL_20]], %[[VAL_5]] : !llvm.struct<(ptr, i64)>, !llvm.ptr100// CHECK: %[[VAL_21:.*]] = llvm.load %[[VAL_5]] : !llvm.ptr -> !llvm.struct<(ptr, i64)>101// CHECK: %[[VAL_22:.*]] = llvm.extractvalue %[[VAL_21]][0] : !llvm.struct<(ptr, i64)>102// CHECK: %[[VAL_23:.*]] = llvm.extractvalue %[[VAL_21]][1] : !llvm.struct<(ptr, i64)>103// CHECK: %[[VAL_24:.*]] = llvm.sub %[[VAL_23]], %[[VAL_6]] : i64104// CHECK: %[[VAL_25:.*]] = omp.map.bounds lower_bound(%[[VAL_7]] : i64) upper_bound(%[[VAL_24]] : i64) extent(%[[VAL_23]] : i64) stride(%[[VAL_6]] : i64) start_idx(%[[VAL_7]] : i64) {stride_in_bytes = true}105// CHECK: %[[VAL_26:.*]] = llvm.load %[[VAL_5]] : !llvm.ptr -> !llvm.struct<(ptr, i64)>106// CHECK: %[[VAL_27:.*]] = llvm.load %[[HEAP0]] : !llvm.ptr -> !llvm.struct<(ptr, i64)>107// CHECK: %[[VAL_28:.*]] = llvm.call @boxchar_firstprivate_init(%[[VAL_26]], %[[VAL_27]]) : (!llvm.struct<(ptr, i64)>, !llvm.struct<(ptr, i64)>) -> !llvm.struct<(ptr, i64)>108// CHECK: %[[VAL_29:.*]] = llvm.call @boxchar_firstprivate_copy(%[[VAL_26]], %[[VAL_28]]) : (!llvm.struct<(ptr, i64)>, !llvm.struct<(ptr, i64)>) -> !llvm.struct<(ptr, i64)>109// CHECK: llvm.store %[[VAL_29]], %[[HEAP0]] : !llvm.struct<(ptr, i64)>, !llvm.ptr110// CHECK: %[[VAL_30:.*]] = omp.map.info var_ptr(%[[VAL_1]] : !llvm.ptr, i32) map_clauses(to) capture(ByCopy) -> !llvm.ptr111// CHECK: %[[VAL_31:.*]] = llvm.getelementptr %[[HEAP0]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64)>112// CHECK: %[[VAL_32:.*]] = omp.map.info var_ptr(%[[HEAP0]] : !llvm.ptr, i8) map_clauses(implicit, to) capture(ByRef) var_ptr_ptr(%[[VAL_31]] : !llvm.ptr) bounds(%[[VAL_25]]) -> !llvm.ptr113// CHECK: %[[VAL_33:.*]] = omp.map.info var_ptr(%[[HEAP0]] : !llvm.ptr, !llvm.struct<(ptr, i64)>) map_clauses(to) capture(ByRef) members(%[[VAL_32]] : [0] : !llvm.ptr) -> !llvm.ptr114// CHECK: %[[VAL_34:.*]] = llvm.load %[[HEAP0]] : !llvm.ptr -> !llvm.struct<(ptr, i64)>115// CHECK: omp.target depend(taskdependout -> %[[HEAP0]] : !llvm.ptr) nowait map_entries(%[[VAL_33]] -> %[[VAL_35:.*]], %[[VAL_30]] -> %[[VAL_36:.*]], %[[VAL_32]] -> %[[VAL_37:.*]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) private(@boxchar_firstprivate %[[VAL_34]] -> %[[VAL_38:.*]] [map_idx=0], @private_eye %[[VAL_1]] -> %[[VAL_39:.*]] [map_idx=1] : !llvm.struct<(ptr, i64)>, !llvm.ptr) {116// CHECK: omp.terminator117// CHECK: }118// CHECK: omp.task depend(taskdependin -> %[[HEAP0]] : !llvm.ptr) {119// CHECK: llvm.call @boxchar_firstprivate_dealloc(%[[VAL_29]]) : (!llvm.struct<(ptr, i64)>) -> ()120// CHECK: llvm.call @free(%[[HEAP0]]) : (!llvm.ptr) -> ()121// CHECK: omp.terminator122// CHECK: }123// CHECK: llvm.return124// CHECK: }125 126// CHECK-LABEL: llvm.func @boxchar_firstprivate_init(127// CHECK-SAME: %[[ARG0:.*]]: !llvm.struct<(ptr, i64)>,128// CHECK-SAME: %[[ARG1:.*]]: !llvm.struct<(ptr, i64)>) -> !llvm.struct<(ptr, i64)> attributes {always_inline} {129// CHECK: %[[VAL_0:.*]] = llvm.extractvalue %[[ARG0]][0] : !llvm.struct<(ptr, i64)>130// CHECK: %[[VAL_1:.*]] = llvm.extractvalue %[[ARG0]][1] : !llvm.struct<(ptr, i64)>131// CHECK: %[[VAL_2:.*]] = llvm.call @malloc(%[[VAL_1]]) {bindc_name = "", uniq_name = ""} : (i64) -> !llvm.ptr132// CHECK: %[[VAL_3:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i64)>133// CHECK: %[[VAL_4:.*]] = llvm.insertvalue %[[VAL_2]], %[[VAL_3]][0] : !llvm.struct<(ptr, i64)>134// CHECK: %[[VAL_5:.*]] = llvm.insertvalue %[[VAL_1]], %[[VAL_4]][1] : !llvm.struct<(ptr, i64)>135// CHECK: llvm.return %[[VAL_5]] : !llvm.struct<(ptr, i64)>136// CHECK: }137 138// CHECK-LABEL: llvm.func @boxchar_firstprivate_copy(139// CHECK-SAME: %[[ARG0:.*]]: !llvm.struct<(ptr, i64)>,140// CHECK-SAME: %[[ARG1:.*]]: !llvm.struct<(ptr, i64)>) -> !llvm.struct<(ptr, i64)> attributes {always_inline} {141// CHECK: %[[VAL_0:.*]] = llvm.extractvalue %[[ARG0]][0] : !llvm.struct<(ptr, i64)>142// CHECK: %[[VAL_1:.*]] = llvm.extractvalue %[[ARG0]][1] : !llvm.struct<(ptr, i64)>143// CHECK: %[[VAL_2:.*]] = llvm.extractvalue %[[ARG1]][0] : !llvm.struct<(ptr, i64)>144// CHECK: %[[VAL_3:.*]] = llvm.extractvalue %[[ARG1]][1] : !llvm.struct<(ptr, i64)>145// CHECK: %[[VAL_4:.*]] = llvm.icmp "slt" %[[VAL_3]], %[[VAL_1]] : i64146// CHECK: %[[VAL_5:.*]] = llvm.select %[[VAL_4]], %[[VAL_3]], %[[VAL_1]] : i1, i64147// CHECK: "llvm.intr.memmove"(%[[VAL_2]], %[[VAL_0]], %[[VAL_5]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()148// CHECK: llvm.return %[[ARG1]] : !llvm.struct<(ptr, i64)>149// CHECK: }150 151// CHECK-LABEL: llvm.func @boxchar_firstprivate_dealloc(152// CHECK-SAME: %[[ARG0:.*]]: !llvm.struct<(ptr, i64)>) attributes {always_inline} {153// CHECK: %[[VAL_0:.*]] = llvm.extractvalue %[[ARG0]][0] : !llvm.struct<(ptr, i64)>154// CHECK: %[[VAL_1:.*]] = llvm.extractvalue %[[ARG0]][1] : !llvm.struct<(ptr, i64)>155// CHECK: llvm.call @free(%[[VAL_0]]) : (!llvm.ptr) -> ()156// CHECK: llvm.return157// CHECK: }158