brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · 60c6fa4 Raw
109 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s2 3// The aim of the test is to check the LLVM IR codegen for the device4// for omp target parallel construct5 6module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.alloca_memory_space", 5 : ui32>>, llvm.data_layout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128:128:48-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9", llvm.target_triple = "amdgcn-amd-amdhsa", omp.is_gpu = true, omp.is_target_device = true} {7  llvm.func @_QQmain_omp_outline_1(%arg0: !llvm.ptr) attributes {omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (to)>} {8    %0 = omp.map.info var_ptr(%arg0 : !llvm.ptr, i32) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = "d"}9    omp.target map_entries(%0 -> %arg2 : !llvm.ptr) {10      omp.parallel {11        %1 = llvm.mlir.constant(1 : i32) : i3212        llvm.store %1, %arg2 : i32, !llvm.ptr13        omp.terminator14      }15    omp.terminator16    }17  llvm.return18  }19 20  llvm.func @_test_num_threads(%arg0: !llvm.ptr) attributes {omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (to)>} {21    %0 = omp.map.info var_ptr(%arg0 : !llvm.ptr, i32) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = "d"}22    omp.target map_entries(%0 -> %arg2 : !llvm.ptr) {23      %1 = llvm.mlir.constant(156 : i32) : i3224      omp.parallel num_threads(%1 : i32) {25        %2 = llvm.mlir.constant(1 : i32) : i3226        llvm.store %2, %arg2 : i32, !llvm.ptr27        omp.terminator28      }29    omp.terminator30    }31  llvm.return32  }33 34  llvm.func @parallel_if(%arg0: !llvm.ptr {fir.bindc_name = "ifcond"}) {35    %0 = llvm.mlir.constant(1 : i64) : i6436    %1 = llvm.alloca %0 x i32 {bindc_name = "d"} : (i64) -> !llvm.ptr<5>37    %cast = llvm.addrspacecast %1 : !llvm.ptr<5> to !llvm.ptr38    %2 = omp.map.info var_ptr(%cast : !llvm.ptr, i32) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = "d"}39    %3 = omp.map.info var_ptr(%arg0 : !llvm.ptr, i32) map_clauses(implicit, exit_release_or_enter_alloc) capture(ByCopy) -> !llvm.ptr {name = "ifcond"}40    omp.target map_entries(%2 -> %arg1, %3 -> %arg2 : !llvm.ptr, !llvm.ptr) {41      %4 = llvm.mlir.constant(10 : i32) : i3242      %5 = llvm.load %arg2 : !llvm.ptr -> i3243      %6 = llvm.mlir.constant(0 : i64) : i3244      %7 = llvm.icmp "ne" %5, %6 : i3245      omp.parallel if(%7) {46        llvm.store %4, %arg1 : i32, !llvm.ptr47        omp.terminator48      }49      omp.terminator50    }51    llvm.return52  }53}54 55// CHECK: define weak_odr protected amdgpu_kernel void @[[FUNC0:.*]](56// CHECK-SAME: ptr %[[TMP:.*]], ptr %[[TMP0:.*]]) #{{[0-9]+}} {57// CHECK:         %[[TMP1:.*]] = alloca [1 x ptr], align 8, addrspace(5)58// CHECK:         %[[TMP2:.*]] = addrspacecast ptr addrspace(5) %[[TMP1]] to ptr59// CHECK:         %[[STRUCTARG:.*]] = alloca { ptr }, align 8, addrspace(5)60// CHECK:         %[[STRUCTARG_ASCAST:.*]] = addrspacecast ptr addrspace(5) %[[STRUCTARG]] to ptr61// CHECK:         %[[TMP3:.*]] = alloca ptr, align 8, addrspace(5)62// CHECK:         %[[TMP4:.*]] = addrspacecast ptr addrspace(5) %[[TMP3]] to ptr63// CHECK:         store ptr %[[TMP0]], ptr %[[TMP4]], align 864// CHECK:         %[[TMP5:.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @{{.*}} to ptr), ptr %[[TMP]])65// CHECK:         %[[EXEC_USER_CODE:.*]] = icmp eq i32 %[[TMP5]], -166// CHECK:         br i1 %[[EXEC_USER_CODE]], label %[[USER_CODE_ENTRY:.*]], label %[[WORKER_EXIT:.*]]67// CHECK:         %[[TMP6:.*]] = load ptr, ptr %[[TMP4]], align 868// CHECK:         %[[OMP_GLOBAL_THREAD_NUM:.*]] = call i32 @__kmpc_global_thread_num(ptr addrspacecast (ptr addrspace(1) @[[GLOB1:[0-9]+]] to ptr))69// CHECK:         %[[GEP_:.*]] = getelementptr { ptr }, ptr addrspace(5) %[[STRUCTARG]], i32 0, i32 070// CHECK:         store ptr %[[TMP6]], ptr addrspace(5) %[[GEP_]], align 871// CHECK:         %[[TMP7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[TMP2]], i64 0, i64 072// CHECK:         store ptr %[[STRUCTARG_ASCAST]], ptr %[[TMP7]], align 873// CHECK:         call void @__kmpc_parallel_51(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr), i32 %[[OMP_GLOBAL_THREAD_NUM]], i32 1, i32 -1, i32 -1, ptr @[[FUNC1:.*]], ptr null, ptr %[[TMP2]], i64 1)74// CHECK:         call void @__kmpc_target_deinit()75 76// CHECK: define internal void @[[FUNC1]](77// CHECK-SAME: ptr noalias noundef {{.*}}, ptr noalias noundef {{.*}}, ptr {{.*}}) #{{[0-9]+}} {78 79// Test if num_threads OpenMP clause for target region is correctly lowered80// and passed as a param to kmpc_parallel_51 function81 82// CHECK: define weak_odr protected amdgpu_kernel void [[FUNC_NUM_THREADS0:@.*]](83// CHECK-NOT:     call void @__kmpc_push_num_threads(84// CHECK:         call void @__kmpc_parallel_51(ptr addrspacecast (85// CHECK-SAME:  ptr addrspace(1) @[[NUM_THREADS_GLOB:[0-9]+]] to ptr),86// CHECK-SAME:  i32 [[NUM_THREADS_TMP0:%.*]], i32 1, i32 156,87// CHECK-SAME:  i32 -1,  ptr [[FUNC_NUM_THREADS1:@.*]], ptr null, ptr [[NUM_THREADS_TMP1:%.*]], i64 1)88 89// One of the arguments of  kmpc_parallel_51 function is responsible for handling if clause90// of omp parallel construct for target region. If this  argument is nonzero,91// then kmpc_parallel_51 launches multiple threads for parallel region.92//93// This test checks if MLIR expression:94//      %7 = llvm.icmp "ne" %5, %6 : i3295//      omp.parallel if(%7)96// is correctly lowered to LLVM IR code and the if condition variable97// is passed as a param to kmpc_parallel_51 function98 99// CHECK: define weak_odr protected amdgpu_kernel void @{{.*}}(100// CHECK-SAME: ptr {{.*}}, ptr {{.*}}, ptr %[[IFCOND_ARG2:.*]]) #{{[0-9]+}} {101// CHECK:         store ptr %[[IFCOND_ARG2]], ptr %[[IFCOND_TMP1:.*]], align 8102// CHECK:         %[[IFCOND_TMP2:.*]] = load i32, ptr %[[IFCOND_TMP1]], align 4103// CHECK:         %[[IFCOND_TMP3:.*]] = icmp ne i32 %[[IFCOND_TMP2]], 0104// CHECK:         %[[IFCOND_TMP4:.*]] = sext i1 %[[IFCOND_TMP3]] to i32105// CHECK:         call void @__kmpc_parallel_51(ptr addrspacecast (106// CHECK-SAME:  ptr addrspace(1) {{.*}} to ptr),107// CHECK-SAME:  i32 {{.*}}, i32 %[[IFCOND_TMP4]], i32 -1,108// CHECK-SAME:  i32 -1,  ptr {{.*}}, ptr null, ptr {{.*}}, i64 1)109