[flang-commits] [flang] [flang] Consider bind(c) when lowering calls to intrinsic module procedures (PR #70386)

Razvan Lupusoru via flang-commits flang-commits at lists.llvm.org
Thu Oct 26 16:39:04 PDT 2023


https://github.com/razvanlupusoru updated https://github.com/llvm/llvm-project/pull/70386

>From 6b9e225da0f4e4b944f354c214ee09fc29467215 Mon Sep 17 00:00:00 2001
From: Razvan Lupusoru <rlupusoru at nvidia.com>
Date: Thu, 26 Oct 2023 15:17:20 -0700
Subject: [PATCH 1/2] [flang] Consider bind(c) when lowering calls to intrinsic
 module procedures

When attempting to lower an intrinsic module procedure call, take into
account bind(c). Such procedures cannot be lowered as intrinsics
since their implementation is external to the module.

With this solution, the hardcoded "omp_lib" string can be removed when
checking if intrinsic module procedure since all procedure interfaces in
that module use bind(c).
---
 flang/lib/Lower/ConvertCall.cpp | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp
index bc9426827c3ba1d..82e1ece4efeafe7 100644
--- a/flang/lib/Lower/ConvertCall.cpp
+++ b/flang/lib/Lower/ConvertCall.cpp
@@ -2122,7 +2122,12 @@ genProcedureRef(CallContext &callContext) {
   mlir::Location loc = callContext.loc;
   if (auto *intrinsic = callContext.procRef.proc().GetSpecificIntrinsic())
     return genIntrinsicRef(intrinsic, callContext);
-  if (Fortran::lower::isIntrinsicModuleProcRef(callContext.procRef))
+  // If it is an intrinsic module procedure reference - then treat as
+  // intrinsic unless it is bind(c) (since implementation is external from
+  // module).
+  if (Fortran::lower::isIntrinsicModuleProcRef(callContext.procRef) &&
+      !Fortran::semantics::IsBindCProcedure(
+          *callContext.procRef.proc().GetSymbol()))
     return genIntrinsicRef(nullptr, callContext);
 
   if (callContext.isStatementFunctionCall())
@@ -2227,8 +2232,7 @@ bool Fortran::lower::isIntrinsicModuleProcRef(
     return false;
   const Fortran::semantics::Symbol *module =
       symbol->GetUltimate().owner().GetSymbol();
-  return module && module->attrs().test(Fortran::semantics::Attr::INTRINSIC) &&
-         module->name().ToString().find("omp_lib") == std::string::npos;
+  return module && module->attrs().test(Fortran::semantics::Attr::INTRINSIC);
 }
 
 std::optional<hlfir::EntityWithAttributes> Fortran::lower::convertCallToHLFIR(

>From dcf0b973be174c44904d57ddb9764a0986cce3a4 Mon Sep 17 00:00:00 2001
From: Razvan Lupusoru <rlupusoru at nvidia.com>
Date: Thu, 26 Oct 2023 16:38:50 -0700
Subject: [PATCH 2/2] Add lowering test calling omp_lib

---
 .../test/Lower/OpenMP/omp-lib-num-threads.f90 | 21 +++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 flang/test/Lower/OpenMP/omp-lib-num-threads.f90

diff --git a/flang/test/Lower/OpenMP/omp-lib-num-threads.f90 b/flang/test/Lower/OpenMP/omp-lib-num-threads.f90
new file mode 100644
index 000000000000000..01c3e93d97bfcc0
--- /dev/null
+++ b/flang/test/Lower/OpenMP/omp-lib-num-threads.f90
@@ -0,0 +1,21 @@
+! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - 2>&1 | FileCheck %s
+! RUN: bbc -fopenmp -emit-hlfir -o - %s 2>&1 | FileCheck %s
+!
+! Test that the calls to omp_lib's omp_get_num_threads and omp_set_num_threads
+! get lowered even though their implementation is not in the omp_lib module
+! (and this matters because this is an intrinsic module - and calls to
+! intrinsics are specially resolved).
+
+program main
+  use omp_lib
+  integer(omp_integer_kind) :: num_threads
+  integer(omp_integer_kind), parameter :: requested_num_threads = 4
+  call omp_set_num_threads(requested_num_threads)
+  num_threads = omp_get_num_threads()
+  print *, num_threads
+end program
+
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_num_threads
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_num_threads
+!CHECK: fir.call @omp_set_num_threads
+!CHECK: fir.call @omp_get_num_threads



More information about the flang-commits mailing list