161 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s2 3module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.alloca_memory_space", 5 : ui32>>, llvm.target_triple = "amdgcn-amd-amdhsa", omp.is_gpu = true, omp.is_target_device = true} {4 5 omp.private {type = private} @i32_privatizer : i326 7 llvm.func @test_nested_target_in_parallel(%arg0: !llvm.ptr) {8 omp.parallel {9 %0 = llvm.mlir.constant(4 : index) : i6410 %1 = llvm.mlir.constant(1 : index) : i6411 %4 = omp.map.bounds lower_bound(%1 : i64) upper_bound(%0 : i64) stride(%1 : i64) start_idx(%1 : i64)12 %mapv1 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.array<10 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%4) -> !llvm.ptr {name = ""}13 omp.target map_entries(%mapv1 -> %map_arg : !llvm.ptr) {14 omp.terminator15 }16 omp.terminator17 }18 llvm.return19 }20 21// CHECK-LABEL: define void @test_nested_target_in_parallel({{.*}}) {22// CHECK-NEXT: br label %omp.parallel.fake.region23// CHECK: omp.parallel.fake.region:24// CHECK-NEXT: br label %omp.region.cont25// CHECK: omp.region.cont:26// CHECK-NEXT: ret void27// CHECK-NEXT: }28 29 llvm.func @test_nested_target_in_wsloop(%arg0: !llvm.ptr) {30 %8 = llvm.mlir.constant(1 : i64) : i6431 %9 = llvm.alloca %8 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr<5>32 %ascast = llvm.addrspacecast %9 : !llvm.ptr<5> to !llvm.ptr33 %16 = llvm.mlir.constant(10 : i32) : i3234 %17 = llvm.mlir.constant(1 : i32) : i3235 omp.wsloop private(@i32_privatizer %ascast -> %loop_arg : !llvm.ptr) {36 omp.loop_nest (%arg1) : i32 = (%17) to (%16) inclusive step (%17) {37 llvm.store %arg1, %loop_arg : i32, !llvm.ptr38 %0 = llvm.mlir.constant(4 : index) : i6439 %1 = llvm.mlir.constant(1 : index) : i6440 %4 = omp.map.bounds lower_bound(%1 : i64) upper_bound(%0 : i64) stride(%1 : i64) start_idx(%1 : i64)41 %mapv1 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.array<10 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%4) -> !llvm.ptr {name = ""}42 omp.target map_entries(%mapv1 -> %map_arg : !llvm.ptr) {43 omp.terminator44 }45 omp.yield46 }47 }48 llvm.return49 }50 51// CHECK-LABEL: define void @test_nested_target_in_wsloop(ptr %0) {52// CHECK-NEXT: %{{.*}} = alloca i32, i64 1, align 4, addrspace(5)53// CHECK-NEXT: %{{.*}} = addrspacecast ptr addrspace(5) %{{.*}} to ptr54// CHECK-NEXT: br label %omp.wsloop.fake.region55// CHECK: omp.wsloop.fake.region:56// CHECK-NEXT: br label %omp.loop_nest.fake.region57// CHECK: omp.loop_nest.fake.region:58// CHECK-NEXT: store i32 poison, ptr %{{.*}}59// CHECK-NEXT: br label %omp.region.cont160// CHECK: omp.region.cont1:61// CHECK-NEXT: br label %omp.region.cont62// CHECK: omp.region.cont:63// CHECK-NEXT: ret void64// CHECK-NEXT: }65 66 llvm.func @test_nested_target_in_parallel_with_private(%arg0: !llvm.ptr) {67 %8 = llvm.mlir.constant(1 : i64) : i6468 %9 = llvm.alloca %8 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr<5>69 %ascast = llvm.addrspacecast %9 : !llvm.ptr<5> to !llvm.ptr70 omp.parallel private(@i32_privatizer %ascast -> %i_priv_arg : !llvm.ptr) {71 %1 = llvm.mlir.constant(1 : index) : i6472 // Use the private clause from omp.parallel to make sure block arguments73 // are handled.74 %i_val = llvm.load %i_priv_arg : !llvm.ptr -> i6475 %4 = omp.map.bounds lower_bound(%1 : i64) upper_bound(%i_val : i64) stride(%1 : i64) start_idx(%1 : i64)76 %mapv1 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.array<10 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%4) -> !llvm.ptr {name = ""}77 omp.target map_entries(%mapv1 -> %map_arg : !llvm.ptr) {78 omp.terminator79 }80 omp.terminator81 }82 llvm.return83 }84 85 llvm.func @test_nested_target_in_task_with_private(%arg0: !llvm.ptr) {86 %8 = llvm.mlir.constant(1 : i64) : i6487 %9 = llvm.alloca %8 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr<5>88 %ascast = llvm.addrspacecast %9 : !llvm.ptr<5> to !llvm.ptr89 omp.task private(@i32_privatizer %ascast -> %i_priv_arg : !llvm.ptr) {90 %1 = llvm.mlir.constant(1 : index) : i6491 // Use the private clause from omp.task to make sure block arguments92 // are handled.93 %i_val = llvm.load %i_priv_arg : !llvm.ptr -> i6494 %4 = omp.map.bounds lower_bound(%1 : i64) upper_bound(%i_val : i64) stride(%1 : i64) start_idx(%1 : i64)95 %mapv1 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.array<10 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%4) -> !llvm.ptr {name = ""}96 omp.target map_entries(%mapv1 -> %map_arg : !llvm.ptr) {97 omp.terminator98 }99 omp.terminator100 }101 llvm.return102 }103 104 llvm.func @test_target_and_atomic_update(%x: !llvm.ptr, %expr : i32) {105 omp.target {106 omp.terminator107 }108 109 omp.atomic.update %x : !llvm.ptr {110 ^bb0(%xval: i32):111 %newval = llvm.add %xval, %expr : i32112 omp.yield(%newval : i32)113 }114 115 llvm.return116 }117 118// CHECK-LABEL: define void @test_nested_target_in_parallel_with_private({{.*}}) {119// CHECK: br label %omp.parallel.fake.region120// CHECK: omp.parallel.fake.region:121// CHECK: br label %omp.region.cont122// CHECK: omp.region.cont:123// CHECK-NEXT: ret void124// CHECK-NEXT: }125 126// CHECK-LABEL: define {{.*}} amdgpu_kernel void @__omp_offloading_{{.*}}_nested_target_in_parallel_{{.*}} {127// CHECK: call i32 @__kmpc_target_init128// CHECK: user_code.entry:129// CHECK: call void @__kmpc_target_deinit()130// CHECK: ret void131// CHECK: }132 133// CHECK-LABEL: define {{.*}} amdgpu_kernel void @__omp_offloading_{{.*}}_test_nested_target_in_wsloop_{{.*}} {134// CHECK: call i32 @__kmpc_target_init135// CHECK: user_code.entry:136// CHECK: call void @__kmpc_target_deinit()137// CHECK: ret void138// CHECK: }139 140// CHECK-LABEL: define {{.*}} amdgpu_kernel void @__omp_offloading_{{.*}}_test_nested_target_in_parallel_with_private_{{.*}} {141// CHECK: call i32 @__kmpc_target_init142// CHECK: user_code.entry:143// CHECK: call void @__kmpc_target_deinit()144// CHECK: ret void145// CHECK: }146 147// CHECK-LABEL: define {{.*}} amdgpu_kernel void @__omp_offloading_{{.*}}_test_nested_target_in_task_with_private_{{.*}} {148// CHECK: call i32 @__kmpc_target_init149// CHECK: user_code.entry:150// CHECK: call void @__kmpc_target_deinit()151// CHECK: ret void152// CHECK: }153 154// CHECK-LABEL: define {{.*}} amdgpu_kernel void @__omp_offloading_{{.*}}_test_target_and_atomic_update_{{.*}} {155// CHECK: call i32 @__kmpc_target_init156// CHECK: user_code.entry:157// CHECK: call void @__kmpc_target_deinit()158// CHECK: ret void159// CHECK: }160}161