[PATCH] D142914: [MLIR][OpenMP] Added OMPIRBuilder support for Target Data directives.

Akash Banerjee via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 22 10:47:35 PST 2023


TIFitis marked 4 inline comments as done.
TIFitis added a comment.

In D142914#4144475 <https://reviews.llvm.org/D142914#4144475>, @kiranchandramohan wrote:

> Please add tests for the MLIR portion.

Can you please tell me where to add these?

> Could you also post the full LLVM IR for a construct with the map clause?

The following is a simple example, let me know if you'd like a more complex example with loop :)

**Flang:**

  subroutine openmp_target_data
      integer :: i
      !$omp target data map(tofrom: i)
          i = 99;
      !$omp end target data
  end subroutine openmp_target_data

**FIR:**

  func.func @_QPopenmp_target_data() {
    %0 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFopenmp_target_dataEi"}
    omp.target_data   map((tofrom -> %0 : !fir.ref<i32>)) {
      %c99_i32 = arith.constant 99 : i32
      fir.store %c99_i32 to %0 : !fir.ref<i32>
      omp.terminator
    }
    return
  }

**LLVMIR:**

  llvm.func @_QPopenmp_target_data() {
    %0 = llvm.mlir.constant(1 : i64) : i64
    %1 = llvm.alloca %0 x i32 {bindc_name = "i", in_type = i32, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_dataEi"} : (i64) -> !llvm.ptr<i32>
    omp.target_data   map((tofrom -> %1 : !llvm.ptr<i32>)) {
      %2 = llvm.mlir.constant(99 : i32) : i32
      llvm.store %2, %1 : !llvm.ptr<i32>
      omp.terminator
    }
    llvm.return
  }

**llvm IR .ll:**

  ; ModuleID = 'LLVMDialectModule'
  source_filename = "LLVMDialectModule"
  target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
  target triple = "aarch64-unknown-linux-gnu"
  
  %struct.ident_t = type { i32, i32, i32, i32, ptr }
  
  @0 = private unnamed_addr constant [26 x i8] c";test.mlir;unknown;4;10;;\00", align 1
  @1 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
  @2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 22, ptr @1 }, align 8
  @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 3]
  @.offload_mapnames = private constant [1 x ptr] [ptr @0]
  
  declare ptr @malloc(i64)
  
  declare void @free(ptr)
  
  define void @_QPopenmp_target_data() {
    %1 = alloca [1 x ptr], align 8
    %2 = alloca [1 x ptr], align 8
    %3 = alloca [1 x i64], align 8
    %4 = alloca i32, i64 1, align 4
    br label %entry
  
  entry:                                            ; preds = %0
    %5 = getelementptr inbounds [1 x ptr], ptr %1, i32 0, i32 0
    store ptr %4, ptr %5, align 8
    %6 = getelementptr inbounds [1 x ptr], ptr %2, i32 0, i32 0
    store ptr %4, ptr %6, align 8
    %7 = getelementptr inbounds [1 x i64], ptr %3, i32 0, i32 0
    store i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64), ptr %7, align 8
    %8 = getelementptr inbounds [1 x ptr], ptr %1, i32 0, i32 0
    %9 = getelementptr inbounds [1 x ptr], ptr %2, i32 0, i32 0
    %10 = getelementptr inbounds [1 x i64], ptr %3, i32 0, i32 0
    call void @__tgt_target_data_begin_mapper(ptr @2, i64 -1, i32 1, ptr %8, ptr %9, ptr %10, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
    br label %omp.data.region
  
  omp.data.region:                                  ; preds = %entry
    store i32 99, ptr %4, align 4
    br label %omp.region.cont
  
  omp.region.cont:                                  ; preds = %omp.data.region
    %11 = getelementptr inbounds [1 x ptr], ptr %1, i32 0, i32 0
    %12 = getelementptr inbounds [1 x ptr], ptr %2, i32 0, i32 0
    %13 = getelementptr inbounds [1 x i64], ptr %3, i32 0, i32 0
    call void @__tgt_target_data_end_mapper(ptr @2, i64 -1, i32 1, ptr %11, ptr %12, ptr %13, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
    ret void
  }
  
  ; Function Attrs: nounwind
  declare void @__tgt_target_data_begin_mapper(ptr, i64, i32, ptr, ptr, ptr, ptr, ptr, ptr) #0
  
  ; Function Attrs: nounwind
  declare void @__tgt_target_data_end_mapper(ptr, i64, i32, ptr, ptr, ptr, ptr, ptr, ptr) #0
  
  attributes #0 = { nounwind }
  
  !llvm.module.flags = !{!0}
  
  !0 = !{i32 2, !"Debug Info Version", i32 3}

Cheers,
Akash



================
Comment at: mlir/lib/Target/LLVMIR/Dialect/Utils.cpp:1
+//===- Utils.cpp - General Utils for translating MLIR dialect to LLVM IR---===//
+//
----------------
kiranchandramohan wrote:
> Nit: I would prefer the OpenMPCommon.cpp name suggested in https://discourse.llvm.org/t/rfc-adding-new-util-file-to-mlir-dialect-translation/68221. 
Would you also like me to move the file inside OpenMP ( `mlir/lib/Target/LLVMIR/Dialect/OpenMP` ) ?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142914/new/

https://reviews.llvm.org/D142914



More information about the llvm-commits mailing list