[flang-commits] [PATCH] D132154: [flang] Legacy extension intrinsic functions IMAG, IZEXT, JZEXT

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


This revision was automatically updated to reflect the committed changes.
Closed by commit rG6d279f40510a: [flang] Legacy extension intrinsic functions IMAG, IZEXT, JZEXT (authored by klausler).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132154/new/

https://reviews.llvm.org/D132154

Files:
  flang/docs/Extensions.md
  flang/lib/Evaluate/fold-integer.cpp
  flang/lib/Evaluate/intrinsics.cpp
  flang/test/Evaluate/fold-jzext.f90


Index: flang/test/Evaluate/fold-jzext.f90
===================================================================
--- /dev/null
+++ 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
Index: flang/lib/Evaluate/intrinsics.cpp
===================================================================
--- flang/lib/Evaluate/intrinsics.cpp
+++ flang/lib/Evaluate/intrinsics.cpp
@@ -507,6 +507,8 @@
         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 @@
 // 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 @@
 // 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"},
Index: flang/lib/Evaluate/fold-integer.cpp
===================================================================
--- flang/lib/Evaluate/fold-integer.cpp
+++ flang/lib/Evaluate/fold-integer.cpp
@@ -762,6 +762,17 @@
                 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" ||
Index: flang/docs/Extensions.md
===================================================================
--- flang/docs/Extensions.md
+++ flang/docs/Extensions.md
@@ -235,6 +235,11 @@
   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 different behavior with various older
+  compilers, so it is not supported.
 
 ### Extensions supported when enabled by options
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132154.453783.patch
Type: text/x-patch
Size: 3498 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220818/67cc864e/attachment.bin>


More information about the flang-commits mailing list