109 lines · plain
1// RUN: split-file %s %t2// RUN: mlir-translate -mlir-to-llvmir %t/host.mlir | FileCheck %s --check-prefix=HOST3// RUN: mlir-translate -mlir-to-llvmir %t/device.mlir | FileCheck %s --check-prefix=DEVICE4 5//--- host.mlir6 7module attributes {omp.is_target_device = false, omp.target_triples = ["amdgcn-amd-amdhsa"]} {8 llvm.func @main(%arg0 : !llvm.ptr) {9 %x = llvm.load %arg0 : !llvm.ptr -> i3210 %0 = omp.map.info var_ptr(%arg0 : !llvm.ptr, i32) map_clauses(to) capture(ByCopy) -> !llvm.ptr11 omp.target host_eval(%x -> %lb, %x -> %ub, %x -> %step : i32, i32, i32) map_entries(%0 -> %ptr : !llvm.ptr) {12 %x.map = llvm.load %ptr : !llvm.ptr -> i3213 omp.teams {14 omp.distribute {15 omp.loop_nest (%iv1) : i32 = (%lb) to (%ub) step (%step) {16 omp.parallel {17 omp.wsloop {18 omp.loop_nest (%iv2) : i32 = (%x.map) to (%x.map) step (%x.map) {19 omp.yield20 }21 }22 omp.terminator23 }24 omp.yield25 }26 }27 omp.terminator28 }29 omp.terminator30 }31 llvm.return32 }33}34 35// HOST-LABEL: define void @main36// HOST: %omp_loop.tripcount = {{.*}}37// HOST-NEXT: br label %[[ENTRY:.*]]38// HOST: [[ENTRY]]:39// HOST: %[[TRIPCOUNT:.*]] = zext i32 %omp_loop.tripcount to i6440// HOST: %[[TRIPCOUNT_KARG:.*]] = getelementptr inbounds nuw %struct.__tgt_kernel_arguments, ptr %[[KARGS:.*]], i32 0, i32 841// HOST-NEXT: store i64 %[[TRIPCOUNT]], ptr %[[TRIPCOUNT_KARG]]42// HOST: %[[RESULT:.*]] = call i32 @__tgt_target_kernel({{.*}}, ptr %[[KARGS]])43// HOST-NEXT: %[[CMP:.*]] = icmp ne i32 %[[RESULT]], 044// HOST-NEXT: br i1 %[[CMP]], label %[[OFFLOAD_FAILED:.*]], label %{{.*}}45// HOST: [[OFFLOAD_FAILED]]:46// HOST: call void @[[TARGET_OUTLINE:.*]]({{.*}})47 48// HOST: define internal void @[[TARGET_OUTLINE]]49// HOST: call void{{.*}}@__kmpc_fork_teams({{.*}}, ptr @[[TEAMS_OUTLINE:.*]], {{.*}})50 51// HOST: define internal void @[[TEAMS_OUTLINE]]52// HOST: call void @__kmpc_for_static_init{{.*}}(ptr {{.*}}, i32 {{.*}}, i32 92, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, i32 {{.*}}, i32 {{.*}})53// HOST: call void (ptr, i32, ptr, ...) @__kmpc_fork_call({{.*}}, ptr @[[PARALLEL_OUTLINE:.*]], {{.*}})54 55// HOST: define internal void @[[PARALLEL_OUTLINE]]56// HOST: call void @__kmpc_for_static_init{{.*}}(ptr {{.*}}, i32 {{.*}}, i32 34, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, i32 {{.*}}, i32 {{.*}})57 58//--- device.mlir59 60module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.alloca_memory_space", 5 : ui32>>, llvm.target_triple = "amdgcn-amd-amdhsa", omp.is_target_device = true, omp.is_gpu = true} {61 llvm.func @main(%arg0 : !llvm.ptr) {62 %0 = omp.map.info var_ptr(%arg0 : !llvm.ptr, i32) map_clauses(to) capture(ByCopy) -> !llvm.ptr63 omp.target map_entries(%0 -> %ptr : !llvm.ptr) {64 %x = llvm.load %ptr : !llvm.ptr -> i3265 omp.teams {66 omp.distribute {67 omp.loop_nest (%iv1) : i32 = (%x) to (%x) step (%x) {68 omp.parallel {69 omp.wsloop {70 omp.loop_nest (%iv2) : i32 = (%x) to (%x) step (%x) {71 omp.yield72 }73 }74 omp.terminator75 }76 omp.yield77 }78 }79 omp.terminator80 }81 omp.terminator82 }83 llvm.return84 }85}86 87// DEVICE: @[[KERNEL_NAME:.*]]_exec_mode = weak protected constant i8 [[EXEC_MODE:3]]88// DEVICE: @llvm.compiler.used = appending global [1 x ptr] [ptr @[[KERNEL_NAME]]_exec_mode], section "llvm.metadata"89// DEVICE: @[[KERNEL_NAME]]_kernel_environment = weak_odr protected constant %struct.KernelEnvironmentTy {90// DEVICE-SAME: %struct.ConfigurationEnvironmentTy { i8 1, i8 1, i8 [[EXEC_MODE]], {{.*}}},91// DEVICE-SAME: ptr @{{.*}}, ptr @{{.*}} }92 93// DEVICE: define weak_odr protected amdgpu_kernel void @[[KERNEL_NAME]]({{.*}})94// DEVICE: %{{.*}} = call i32 @__kmpc_target_init(ptr @[[KERNEL_NAME]]_kernel_environment, {{.*}})95// DEVICE: call void @[[TARGET_OUTLINE:.*]]({{.*}})96// DEVICE: call void @__kmpc_target_deinit()97 98// DEVICE: define internal void @[[TARGET_OUTLINE]]({{.*}})99// DEVICE: call void @[[TEAMS_OUTLINE:.*]]({{.*}})100 101// DEVICE: define internal void @[[TEAMS_OUTLINE]]({{.*}})102// DEVICE: call void @__kmpc_distribute_static_loop{{.*}}({{.*}}, ptr @[[DISTRIBUTE_OUTLINE:[^,]*]], {{.*}})103 104// DEVICE: define internal void @[[DISTRIBUTE_OUTLINE]]({{.*}})105// DEVICE: call void @__kmpc_parallel_51(ptr {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, ptr @[[PARALLEL_OUTLINE:.*]], ptr {{.*}}, ptr {{.*}}, i64 {{.*}})106 107// DEVICE: define internal void @[[PARALLEL_OUTLINE]]({{.*}})108// DEVICE: call void @__kmpc_for_static_loop{{.*}}({{.*}})109