[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