[flang-commits] [flang] 6d279f4 - [flang] Legacy extension intrinsic functions IMAG, IZEXT, JZEXT

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Thu Aug 18 14:17:13 PDT 2022


Author: Peter Klausler
Date: 2022-08-18T14:16:58-07:00
New Revision: 6d279f40510aa39a8fb3efd25143b2a0ccb0f0f6

URL: https://github.com/llvm/llvm-project/commit/6d279f40510aa39a8fb3efd25143b2a0ccb0f0f6
DIFF: https://github.com/llvm/llvm-project/commit/6d279f40510aa39a8fb3efd25143b2a0ccb0f0f6.diff

LOG: [flang] Legacy extension intrinsic functions IMAG, IZEXT, JZEXT

Support these legacy extension intrinsic functions with unambiguous
semantics in those existing compilers that support them by means
of recognizing them as aliases for standard intrinsics (IMAG) or
with simple rewrites (IZEXT, JZEXT).  Note that ZEXT has different
semantics in different existing compilers, so we will not support it
due to lack of a broad unambiguous precedent.

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

Added: 
    flang/test/Evaluate/fold-jzext.f90

Modified: 
    flang/docs/Extensions.md
    flang/lib/Evaluate/fold-integer.cpp
    flang/lib/Evaluate/intrinsics.cpp

Removed: 
    


################################################################################
diff  --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index 71a3727ef00c3..bd3c7ea415871 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -235,6 +235,11 @@ end
   respectively.
 * A digit count of d=0 is accepted in Ew.0, Dw.0, and Gw.0 output
   editing if no nonzero scale factor (kP) is in effect.
+* The name `IMAG` is accepted as an alias for the generic intrinsic
+  function `AIMAG`.
+* The legacy extension intrinsic functions `IZEXT` and `JZEXT`
+  are supported; `ZEXT` has 
diff erent behavior with various older
+  compilers, so it is not supported.
 
 ### Extensions supported when enabled by options
 

diff  --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 438424a81762c..b19b2db34bbaf 100644
--- a/flang/lib/Evaluate/fold-integer.cpp
+++ b/flang/lib/Evaluate/fold-integer.cpp
@@ -762,6 +762,17 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
                 return i.ISHFTC(countVal);
               }));
     }
+  } else if (name == "izext" || name == "jzext") {
+    if (args.size() == 1) {
+      if (auto *expr{UnwrapExpr<Expr<SomeInteger>>(args[0])}) {
+        // Rewrite to IAND(INT(n,k),255_k) for k=KIND(T)
+        intrinsic->name = "iand";
+        auto converted{ConvertToType<T>(std::move(*expr))};
+        *expr = Fold(context, Expr<SomeInteger>{std::move(converted)});
+        args.emplace_back(AsGenericExpr(Expr<T>{Scalar<T>{255}}));
+        return FoldIntrinsicFunction(context, std::move(funcRef));
+      }
+    }
   } else if (name == "lbound") {
     return LBOUND(context, std::move(funcRef));
   } else if (name == "leadz" || name == "trailz" || name == "poppar" ||

diff  --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index 79aaace8e2bb8..4094a1e671f2b 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -507,6 +507,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
         DefaultLogical, Rank::elemental, IntrinsicClass::inquiryFunction},
     {"is_iostat_end", {{"i", AnyInt}}, DefaultLogical},
     {"is_iostat_eor", {{"i", AnyInt}}, DefaultLogical},
+    {"izext", {{"i", AnyInt}}, TypePattern{IntType, KindCode::exactKind, 2}},
+    {"jzext", {{"i", AnyInt}}, DefaultInt},
     {"kind", {{"x", AnyIntrinsic}}, DefaultInt, Rank::elemental,
         IntrinsicClass::inquiryFunction},
     {"lbound",
@@ -844,7 +846,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
 // TODO: Coarray intrinsic functions
 //   LCOBOUND, UCOBOUND, IMAGE_INDEX, COSHAPE
 // TODO: Non-standard intrinsic functions
-//  LSHIFT, RSHIFT, SHIFT, ZEXT, IZEXT,
+//  LSHIFT, RSHIFT, SHIFT,
 //  COMPL, EQV, NEQV, INT8, JINT, JNINT, KNINT,
 //  QCMPLX, QEXT, QFLOAT, QREAL, DNUM,
 //  INUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN,
@@ -860,6 +862,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
 // compatibility and builtins.
 static const std::pair<const char *, const char *> genericAlias[]{
     {"and", "iand"},
+    {"imag", "aimag"},
     {"or", "ior"},
     {"xor", "ieor"},
     {"__builtin_ieee_selected_real_kind", "selected_real_kind"},

diff  --git a/flang/test/Evaluate/fold-jzext.f90 b/flang/test/Evaluate/fold-jzext.f90
new file mode 100644
index 0000000000000..bb868627e3421
--- /dev/null
+++ b/flang/test/Evaluate/fold-jzext.f90
@@ -0,0 +1,10 @@
+! RUN: %python %S/test_folding.py %s %flang_fc1
+! Tests folding of IZEXT() & JZEXT()
+module m
+  logical, parameter :: test_1 = kind(izext(-1_1)) == 2
+  logical, parameter :: test_2 = izext(-1_1) == 255_2
+  logical, parameter :: test_3 = kind(jzext(-1_1)) == 4
+  logical, parameter :: test_4 = jzext(-1_1) == 255_4
+  logical, parameter :: test_5 = kind(jzext(-1_2)) == 4
+  logical, parameter :: test_6 = jzext(-1_2) == 255_4
+end module


        


More information about the flang-commits mailing list