[flang-commits] [flang] [llvm] Fixing the location attribute added to mapInfoOp (PR #90764)
via flang-commits
flang-commits at lists.llvm.org
Wed May 1 12:18:55 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Anchu Rajendran S (anchuraj)
<details>
<summary>Changes</summary>
Named location attribute added to `tgt_offload_entry` shall be used by runtime calls like `ompx_dump_mapping_tables` to print the information of variables that are mapped to the device. `ompx_dump_mapping_tables` was printing the wrong location information and this change fixes it.
A sample execution of example before the change:
```
omptarget device 0 info: OpenMP Host-Device pointer mappings after block at libomptarget:0:0:
omptarget device 0 info: Host Ptr Target Ptr Size (B) DynRefCount HoldRefCount Declaration
omptarget device 0 info: 0x0000000000206df0 0x00007f02cdc00000 20000000 1 0 <program-file-loc> at unknown:18:35
```
The change replaces unknown to the mapped symbol and location to the declaration location.
---
Full diff: https://github.com/llvm/llvm-project/pull/90764.diff
3 Files Affected:
- (modified) flang/lib/Lower/OpenMP/ClauseProcessor.cpp (+3-1)
- (modified) flang/lib/Lower/OpenMP/OpenMP.cpp (+4-2)
- (added) offload/test/offloading/fortran/dump_map_tables.f90 (+38)
``````````diff
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index 4c51b61f6bf029..1af954f3927b57 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -903,8 +903,10 @@ bool ClauseProcessor::processMap(
// Explicit map captures are captured ByRef by default,
// optimisation passes may alter this to ByCopy or other capture
// types to optimise
+ auto context = converter.getFirOpBuilder().getContext();
+ auto location = mlir::NameLoc::get(mlir::StringAttr::get(context, asFortran.str()), symAddr.getLoc());
mlir::Value mapOp = createMapInfoOp(
- firOpBuilder, clauseLocation, symAddr, mlir::Value{},
+ firOpBuilder, location, symAddr, mlir::Value{},
asFortran.str(), bounds, {},
static_cast<
std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index e932f7c284bca8..00d9eca19d3cc5 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1645,9 +1645,11 @@ genTargetOp(Fortran::lower::AbstractConverter &converter,
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
}
-
+ ;
+ auto context = converter.getFirOpBuilder().getContext();
+ auto location = mlir::NameLoc::get(mlir::StringAttr::get(context, sym.name().ToString()), baseOp.getLoc());
mlir::Value mapOp = createMapInfoOp(
- firOpBuilder, baseOp.getLoc(), baseOp, mlir::Value{}, name.str(),
+ firOpBuilder, location, baseOp, mlir::Value{}, name.str(),
bounds, {},
static_cast<
std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
diff --git a/offload/test/offloading/fortran/dump_map_tables.f90 b/offload/test/offloading/fortran/dump_map_tables.f90
new file mode 100644
index 00000000000000..93de49205b32ec
--- /dev/null
+++ b/offload/test/offloading/fortran/dump_map_tables.f90
@@ -0,0 +1,38 @@
+! Offloading test with a target region mapping a declare target
+! Fortran array writing some values to it and checking the host
+! correctly receives the updates made on the device.
+! REQUIRES: flang
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+
+program map_dump_example
+ INTERFACE
+ SUBROUTINE ompx_dump_mapping_tables() BIND(C)
+ END SUBROUTINE ompx_dump_mapping_tables
+ END INTERFACE
+
+ integer i,j,k,N
+ integer async_q(4)
+ real :: A(5000000),B(5000000),C(5000000)
+ N=5000000
+ do i=1, N
+ A(i)=0
+ enddo
+! clang-format off
+! CHECK: omptarget device 0 info: OpenMP Host-Device pointer mappings after block
+! CHECK-NEXT: omptarget device 0 info: Host Ptr Target Ptr Size (B) DynRefCount HoldRefCount Declaration
+! CHECK-NEXT: omptarget device 0 info: {{(0x[0-9a-f]{16})}} {{(0x[0-9a-f]{16})}} 20000000 1 0 {{.*}} at a(:n):21:11
+! clang-format on
+!$omp target enter data map(to:A(:N))
+ call ompx_dump_mapping_tables()
+!$omp target parallel do
+ do i=1, N
+ A(i)=B(i)*C(i)
+ enddo
+!$omp target exit data map(from:A)
+end program
``````````
</details>
https://github.com/llvm/llvm-project/pull/90764
More information about the flang-commits
mailing list