[flang-commits] [flang] [flang] Accept distinct kinds of arguments to IAND/IEOR/IOR (PR #69782)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Mon Oct 30 12:08:58 PDT 2023
https://github.com/klausler updated https://github.com/llvm/llvm-project/pull/69782
>From 3518a0e4d3274549f370b6ed62446b1f2d49c940 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 20 Oct 2023 14:24:07 -0700
Subject: [PATCH] [flang] Accept distinct kinds of arguments to IAND/IEOR/IOR
As is already supported as a common extension for intrinsic
functions like DIM, allow distinct kinds of integer actual
arguments to the MIL-STD bit intrinsic functions IAND, IEOR,
and IOR, with the kind of the result being the largest of
the kinds of the operands. (Though one could make a case that
IAND should return the smallest kind of its operands, that's
not what other compilers do.)
---
flang/docs/Extensions.md | 2 +-
flang/lib/Evaluate/intrinsics.cpp | 10 +++++++---
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index 373f18e1e22847b..2786a8cca73b5b5 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -177,7 +177,7 @@ end
or `EXTENDEDTYPE(PARENTTYPE=PARENTTYPE(1,2,3))`).
* Some intrinsic functions are specified in the standard as requiring the
same type and kind for their arguments (viz., ATAN with two arguments,
- ATAN2, DIM, HYPOT, MAX, MIN, MOD, and MODULO);
+ ATAN2, DIM, HYPOT, IAND, IEOR, IOR, MAX, MIN, MOD, and MODULO);
we allow distinct types to be used, promoting
the arguments as if they were operands to an intrinsic `+` operator,
and defining the result type accordingly.
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index e4125f6572aa983..c711b4feaca4831 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -170,6 +170,7 @@ static constexpr TypePattern SameType{AnyType, KindCode::same};
// an intrinsic operation like addition. This is a nonstandard but nearly
// universal extension feature.
static constexpr TypePattern OperandReal{RealType, KindCode::operand};
+static constexpr TypePattern OperandInt{IntType, KindCode::operand};
static constexpr TypePattern OperandIntOrReal{IntOrRealType, KindCode::operand};
// For ASSOCIATED, the first argument is a typeless pointer
@@ -517,13 +518,15 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
SameInt, Rank::dimReduced, IntrinsicClass::transformationalFunction},
{"iparity", {{"array", SameInt, Rank::array}, MissingDIM, OptionalMASK},
SameInt, Rank::scalar, IntrinsicClass::transformationalFunction},
- {"iand", {{"i", SameInt}, {"j", SameInt, Rank::elementalOrBOZ}}, SameInt},
+ {"iand", {{"i", OperandInt}, {"j", OperandInt, Rank::elementalOrBOZ}},
+ OperandInt},
{"iand", {{"i", BOZ}, {"j", SameInt}}, SameInt},
{"ibclr", {{"i", SameInt}, {"pos", AnyInt}}, SameInt},
{"ibits", {{"i", SameInt}, {"pos", AnyInt}, {"len", AnyInt}}, SameInt},
{"ibset", {{"i", SameInt}, {"pos", AnyInt}}, SameInt},
{"ichar", {{"c", AnyChar}, DefaultingKIND}, KINDInt},
- {"ieor", {{"i", SameInt}, {"j", SameInt, Rank::elementalOrBOZ}}, SameInt},
+ {"ieor", {{"i", OperandInt}, {"j", OperandInt, Rank::elementalOrBOZ}},
+ OperandInt},
{"ieor", {{"i", BOZ}, {"j", SameInt}}, SameInt},
{"image_status", {{"image", SameInt}, OptionalTEAM}, DefaultInt},
{"index",
@@ -533,7 +536,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
KINDInt},
{"int", {{"a", AnyNumeric, Rank::elementalOrBOZ}, DefaultingKIND}, KINDInt},
{"int_ptr_kind", {}, DefaultInt, Rank::scalar},
- {"ior", {{"i", SameInt}, {"j", SameInt, Rank::elementalOrBOZ}}, SameInt},
+ {"ior", {{"i", OperandInt}, {"j", OperandInt, Rank::elementalOrBOZ}},
+ OperandInt},
{"ior", {{"i", BOZ}, {"j", SameInt}}, SameInt},
{"ishft", {{"i", SameInt}, {"shift", AnyInt}}, SameInt},
{"ishftc",
More information about the flang-commits
mailing list