[flang-commits] [flang] 96fd54c - [flang] Lower present intrinsic

Valentin Clement via flang-commits flang-commits at lists.llvm.org
Thu Mar 17 05:19:47 PDT 2022


Author: Valentin Clement
Date: 2022-03-17T13:19:40+01:00
New Revision: 96fd54c9641f311dfbef4e8f7601ab4d4c58a4fa

URL: https://github.com/llvm/llvm-project/commit/96fd54c9641f311dfbef4e8f7601ab4d4c58a4fa
DIFF: https://github.com/llvm/llvm-project/commit/96fd54c9641f311dfbef4e8f7601ab4d4c58a4fa.diff

LOG: [flang] Lower present intrinsic

This patch adds lowering for the `present` intrinsic.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D121884

Co-authored-by: Jean Perier <jperier at nvidia.com>

Added: 
    flang/test/Lower/Intrinsics/present.f90

Modified: 
    flang/lib/Lower/IntrinsicCall.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp
index 1b64197aaf368..404a9acae97ff 100644
--- a/flang/lib/Lower/IntrinsicCall.cpp
+++ b/flang/lib/Lower/IntrinsicCall.cpp
@@ -485,6 +485,7 @@ struct IntrinsicLibrary {
   mlir::Value genNot(mlir::Type, llvm::ArrayRef<mlir::Value>);
   fir::ExtendedValue genNull(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genPack(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
+  fir::ExtendedValue genPresent(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   fir::ExtendedValue genProduct(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
   void genRandomInit(llvm::ArrayRef<fir::ExtendedValue>);
   void genRandomNumber(llvm::ArrayRef<fir::ExtendedValue>);
@@ -726,6 +727,10 @@ static constexpr IntrinsicHandler handlers[]{
        {"mask", asBox},
        {"vector", asBox, handleDynamicOptional}}},
      /*isElemental=*/false},
+    {"present",
+     &I::genPresent,
+     {{{"a", asInquired}}},
+     /*isElemental=*/false},
     {"product",
      &I::genProduct,
      {{{"array", asBox},
@@ -2563,6 +2568,15 @@ IntrinsicLibrary::genPack(mlir::Type resultType,
                            "unexpected result for PACK");
 }
 
+// PRESENT
+fir::ExtendedValue
+IntrinsicLibrary::genPresent(mlir::Type,
+                             llvm::ArrayRef<fir::ExtendedValue> args) {
+  assert(args.size() == 1);
+  return builder.create<fir::IsPresentOp>(loc, builder.getI1Type(),
+                                          fir::getBase(args[0]));
+}
+
 // PRODUCT
 fir::ExtendedValue
 IntrinsicLibrary::genProduct(mlir::Type resultType,

diff  --git a/flang/test/Lower/Intrinsics/present.f90 b/flang/test/Lower/Intrinsics/present.f90
new file mode 100644
index 0000000000000..faa7aa14d15c7
--- /dev/null
+++ b/flang/test/Lower/Intrinsics/present.f90
@@ -0,0 +1,10 @@
+! RUN: bbc -emit-fir %s -o - | FileCheck %s
+
+! CHECK-LABEL: present_test
+! CHECK-SAME: %[[arg0:[^:]+]]: !fir.box<!fir.array<?xi32>>
+subroutine present_test(a)
+  integer, optional :: a(:)
+
+  if (present(a)) print *,a
+  ! CHECK: %{{.*}} = fir.is_present %[[arg0]] : (!fir.box<!fir.array<?xi32>>) -> i1
+end subroutine


        


More information about the flang-commits mailing list