xref: /llvm-project/mlir/test/Target/LLVMIR/openmp-target-use-device-nested.mlir (revision 6b3ba6677d64e394b9c929ea0d1f7c54e3146fda)
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
2
3// This tests check that target code nested inside a target data region which
4// has only use_device_ptr mapping corectly generates code on the device pass.
5
6// CHECK:         define weak_odr protected amdgpu_kernel void @__omp_offloading{{.*}}main_
7// CHECK-NEXT:       entry:
8// CHECK-NEXT:         %[[VAL_3:.*]] = alloca ptr, align 8
9// CHECK-NEXT:         store ptr %[[VAL_4:.*]], ptr %[[VAL_3]], align 8
10// CHECK-NEXT:         %[[VAL_5:.*]] = call i32 @__kmpc_target_init(ptr @__omp_offloading_{{.*}}_kernel_environment, ptr %[[VAL_6:.*]])
11// CHECK-NEXT:         %[[VAL_7:.*]] = icmp eq i32 %[[VAL_5]], -1
12// CHECK-NEXT:         br i1 %[[VAL_7]], label %[[VAL_8:.*]], label %[[VAL_9:.*]]
13// CHECK:            user_code.entry:                                  ; preds = %[[VAL_10:.*]]
14// CHECK-NEXT:         %[[VAL_11:.*]] = load ptr, ptr %[[VAL_3]], align 8
15// CHECK-NEXT:         br label %[[AFTER_ALLOC:.*]]
16
17// CHECK:            [[AFTER_ALLOC]]:
18// CHECK-NEXT:         br label %[[VAL_12:.*]]
19
20// CHECK:            [[VAL_12]]:
21// CHECK-NEXT:         br label %[[TARGET_REG_ENTRY:.*]]
22
23// CHECK:            [[TARGET_REG_ENTRY]]:                                       ; preds = %[[VAL_12]]
24// CHECK-NEXT:         %[[VAL_13:.*]] = load ptr, ptr %[[VAL_11]], align 8
25// CHECK-NEXT:         store i32 999, ptr %[[VAL_13]], align 4
26// CHECK-NEXT:         br label %[[VAL_14:.*]]
27module attributes {llvm.target_triple = "amdgcn-amd-amdhsa", omp.is_target_device = true } {
28  llvm.func @_QQmain() attributes {fir.bindc_name = "main"} {
29    %0 = llvm.mlir.constant(1 : i64) : i64
30    %a = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
31    %map = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr)   map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
32    omp.target_data use_device_ptr(%map -> %arg0 : !llvm.ptr)  {
33      %map1 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.ptr)   map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
34      omp.target map_entries(%map1 -> %arg1 : !llvm.ptr){
35        %1 = llvm.mlir.constant(999 : i32) : i32
36        %2 = llvm.load %arg1 : !llvm.ptr -> !llvm.ptr
37        llvm.store %1, %2 : i32, !llvm.ptr
38        omp.terminator
39      }
40      omp.terminator
41    }
42    llvm.return
43  }
44}
45