[flang-commits] [flang] 68755f2 - Revert "[flang] Use proper attributes for runtime calls with 'i1' arguments/returns."

Slava Zakharin via flang-commits flang-commits at lists.llvm.org
Thu Dec 1 10:32:54 PST 2022


Author: Slava Zakharin
Date: 2022-12-01T10:32:33-08:00
New Revision: 68755f223fb5f670fe6ab2596aba1cacec626de2

URL: https://github.com/llvm/llvm-project/commit/68755f223fb5f670fe6ab2596aba1cacec626de2
DIFF: https://github.com/llvm/llvm-project/commit/68755f223fb5f670fe6ab2596aba1cacec626de2.diff

LOG: Revert "[flang] Use proper attributes for runtime calls with 'i1' arguments/returns."

This reverts commit d5b0de35bdd9a3f4d4a093e7938b06add34678eb.

Added: 
    

Modified: 
    flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
    flang/include/flang/Optimizer/Dialect/FIRDialect.h
    flang/lib/Lower/IO.cpp
    flang/lib/Lower/IntrinsicCall.cpp
    flang/lib/Optimizer/CodeGen/Target.cpp
    flang/lib/Optimizer/CodeGen/Target.h
    flang/lib/Optimizer/CodeGen/TargetRewrite.cpp

Removed: 
    flang/test/Fir/target-rewrite-integer.fir


################################################################################
diff  --git a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
index 30504555bfca7..3a21479a1cfe2 100644
--- a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h
@@ -20,7 +20,6 @@
 #include "flang/Common/Fortran.h"
 #include "flang/Common/uint128.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
-#include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIRType.h"
 #include "mlir/IR/BuiltinTypes.h"
 #include "mlir/IR/MLIRContext.h"
@@ -412,7 +411,7 @@ static mlir::func::FuncOp getRuntimeFunc(mlir::Location loc,
     return func;
   auto funTy = RuntimeEntry::getTypeModel()(builder.getContext());
   func = builder.createFunction(loc, name, funTy);
-  func->setAttr(FIROpsDialect::getFirRuntimeAttrName(), builder.getUnitAttr());
+  func->setAttr("fir.runtime", builder.getUnitAttr());
   return func;
 }
 

diff  --git a/flang/include/flang/Optimizer/Dialect/FIRDialect.h b/flang/include/flang/Optimizer/Dialect/FIRDialect.h
index c639e7b53eac4..5a69e3fa23a8f 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRDialect.h
+++ b/flang/include/flang/Optimizer/Dialect/FIRDialect.h
@@ -37,11 +37,6 @@ class FIROpsDialect final : public mlir::Dialect {
   void printAttribute(mlir::Attribute attr,
                       mlir::DialectAsmPrinter &p) const override;
 
-  /// Return string name of fir.runtime attribute.
-  static constexpr llvm::StringRef getFirRuntimeAttrName() {
-    return "fir.runtime";
-  }
-
 private:
   // Register the Attributes of this dialect.
   void registerAttributes();

diff  --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp
index 2664c8100709b..4b08b06e013d3 100644
--- a/flang/lib/Lower/IO.cpp
+++ b/flang/lib/Lower/IO.cpp
@@ -27,7 +27,6 @@
 #include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
 #include "flang/Optimizer/Builder/Todo.h"
-#include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Support/FIRContext.h"
 #include "flang/Parser/parse-tree.h"
 #include "flang/Runtime/io-api.h"
@@ -168,8 +167,7 @@ static mlir::func::FuncOp getIORuntimeFunc(mlir::Location loc,
     return func;
   auto funTy = getTypeModel<E>()(builder.getContext());
   func = builder.createFunction(loc, name, funTy);
-  func->setAttr(fir::FIROpsDialect::getFirRuntimeAttrName(),
-                builder.getUnitAttr());
+  func->setAttr("fir.runtime", builder.getUnitAttr());
   func->setAttr("fir.io", builder.getUnitAttr());
   return func;
 }

diff  --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp
index d21c5eabe7b67..76ee6a9a37100 100644
--- a/flang/lib/Lower/IntrinsicCall.cpp
+++ b/flang/lib/Lower/IntrinsicCall.cpp
@@ -32,7 +32,6 @@
 #include "flang/Optimizer/Builder/Runtime/Stop.h"
 #include "flang/Optimizer/Builder/Runtime/Transformational.h"
 #include "flang/Optimizer/Builder/Todo.h"
-#include "flang/Optimizer/Dialect/FIRDialect.h"
 #include "flang/Optimizer/Dialect/FIROpsSupport.h"
 #include "flang/Optimizer/Support/FatalError.h"
 #include "flang/Runtime/entry-names.h"
@@ -1705,8 +1704,7 @@ static mlir::func::FuncOp getFuncOp(mlir::Location loc,
                                     const RuntimeFunction &runtime) {
   mlir::func::FuncOp function = builder.addNamedFunction(
       loc, runtime.symbol, runtime.typeGenerator(builder.getContext()));
-  function->setAttr(fir::FIROpsDialect::getFirRuntimeAttrName(),
-                    builder.getUnitAttr());
+  function->setAttr("fir.runtime", builder.getUnitAttr());
   return function;
 }
 

diff  --git a/flang/lib/Optimizer/CodeGen/Target.cpp b/flang/lib/Optimizer/CodeGen/Target.cpp
index abadfb891eb58..ef8e1d9f536ae 100644
--- a/flang/lib/Optimizer/CodeGen/Target.cpp
+++ b/flang/lib/Optimizer/CodeGen/Target.cpp
@@ -22,19 +22,6 @@
 
 using namespace fir;
 
-namespace fir::details {
-llvm::StringRef Attributes::getIntExtensionAttrName() const {
-  // The attribute names are available via LLVM dialect interfaces
-  // like getZExtAttrName(), getByValAttrName(), etc., so we'd better
-  // use them than literals.
-  if (isZeroExt())
-    return "llvm.zeroext";
-  else if (isSignExt())
-    return "llvm.signext";
-  return {};
-}
-} // namespace fir::details
-
 // Reduce a REAL/float type to the floating point semantics.
 static const llvm::fltSemantics &floatToSemantics(const KindMapping &kindMap,
                                                   mlir::Type type) {
@@ -80,46 +67,6 @@ struct GenericTarget : public CodeGenSpecifics {
                                    /*sret=*/sret, /*append=*/!sret});
     return marshal;
   }
-
-  CodeGenSpecifics::Marshalling
-  integerArgumentType(mlir::Location loc,
-                      mlir::IntegerType argTy) const override {
-    CodeGenSpecifics::Marshalling marshal;
-    AT::IntegerExtension intExt = AT::IntegerExtension::None;
-    if (argTy.getWidth() < getCIntTypeWidth()) {
-      // isSigned() and isUnsigned() branches below are dead code currently.
-      // If needed, we can generate calls with signed/unsigned argument types
-      // to more precisely match C side (e.g. for Fortran runtime functions
-      // with 'unsigned short' arguments).
-      if (argTy.isSigned())
-        intExt = AT::IntegerExtension::Sign;
-      else if (argTy.isUnsigned())
-        intExt = AT::IntegerExtension::Zero;
-      else if (argTy.isSignless()) {
-        // Zero extend for 'i1' and sign extend for other types.
-        if (argTy.getWidth() == 1)
-          intExt = AT::IntegerExtension::Zero;
-        else
-          intExt = AT::IntegerExtension::Sign;
-      }
-    }
-
-    marshal.emplace_back(argTy, AT{/*alignment=*/0, /*byval=*/false,
-                                   /*sret=*/false, /*append=*/false,
-                                   /*intExt=*/intExt});
-    return marshal;
-  }
-
-  CodeGenSpecifics::Marshalling
-  integerReturnType(mlir::Location loc,
-                    mlir::IntegerType argTy) const override {
-    return integerArgumentType(loc, argTy);
-  }
-
-  // Width of 'int' type is 32-bits for almost all targets, except
-  // for AVR and MSP430 (see TargetInfo initializations
-  // in clang/lib/Basic/Targets).
-  unsigned char getCIntTypeWidth() const override { return 32; }
 };
 } // namespace
 

diff  --git a/flang/lib/Optimizer/CodeGen/Target.h b/flang/lib/Optimizer/CodeGen/Target.h
index be6ae6cd75f83..7f6d8d96d23bc 100644
--- a/flang/lib/Optimizer/CodeGen/Target.h
+++ b/flang/lib/Optimizer/CodeGen/Target.h
@@ -29,29 +29,21 @@ namespace details {
 /// LLVMContext.
 class Attributes {
 public:
-  enum class IntegerExtension { None, Zero, Sign };
-
   Attributes(unsigned short alignment = 0, bool byval = false,
-             bool sret = false, bool append = false,
-             IntegerExtension intExt = IntegerExtension::None)
-      : alignment{alignment}, byval{byval}, sret{sret}, append{append},
-        intExt{intExt} {}
+             bool sret = false, bool append = false)
+      : alignment{alignment}, byval{byval}, sret{sret}, append{append} {}
 
   unsigned getAlignment() const { return alignment; }
   bool hasAlignment() const { return alignment != 0; }
   bool isByVal() const { return byval; }
   bool isSRet() const { return sret; }
   bool isAppend() const { return append; }
-  bool isZeroExt() const { return intExt == IntegerExtension::Zero; }
-  bool isSignExt() const { return intExt == IntegerExtension::Sign; }
-  llvm::StringRef getIntExtensionAttrName() const;
 
 private:
   unsigned short alignment{};
   bool byval : 1;
   bool sret : 1;
   bool append : 1;
-  IntegerExtension intExt;
 };
 
 } // namespace details
@@ -102,47 +94,6 @@ class CodeGenSpecifics {
   virtual Marshalling boxcharArgumentType(mlir::Type eleTy,
                                           bool sret = false) const = 0;
 
-  // Compute ABI rules for an integer argument of the given mlir::IntegerType
-  // \p argTy. Note that this methods is supposed to be called for
-  // arguments passed by value not via reference, e.g. the 'i1' argument here:
-  //   declare i1 @_FortranAioOutputLogical(ptr, i1)
-  //
-  // \p loc is the location of the operation using/specifying the argument.
-  //
-  // Currently, the only supported marshalling is whether the argument
-  // should be zero or sign extended.
-  //
-  // The zero/sign extension is especially important to comply with the ABI
-  // used by C/C++ compiler that builds Fortran runtime. As in the above
-  // example the callee will expect the caller to zero extend the second
-  // argument up to the size of the C/C++'s 'int' type.
-  // The corresponding handling in clang is done in
-  // DefaultABIInfo::classifyArgumentType(), and the logic may brielfy
-  // be explained as some sort of extension is required if the integer
-  // type is shorter than the size of 'int' for the target.
-  // The related code is located in ASTContext::isPromotableIntegerType()
-  // and ABIInfo::isPromotableIntegerTypeForABI().
-  // In particular, the latter returns 'true' for 'bool', several kinds
-  // of 'char', 'short', 'wchar' and enumerated types.
-  // The type of the extensions (zero or sign) depends on the signedness
-  // of the original language type.
-  //
-  // It is not clear how to handle signless integer types.
-  // From the point of Fortran-C interface all supported integer types
-  // seem to be signed except for CFI_type_Bool/bool that is supported
-  // via signless 'i1', but that is treated as unsigned type by clang
-  // (e.g. 'bool' arguments are using 'zeroext' ABI).
-  virtual Marshalling integerArgumentType(mlir::Location loc,
-                                          mlir::IntegerType argTy) const = 0;
-
-  // By default, integer argument and return values use the same
-  // zero/sign extension rules.
-  virtual Marshalling integerReturnType(mlir::Location loc,
-                                        mlir::IntegerType argTy) const = 0;
-
-  // Returns width in bits of C/C++ 'int' type size.
-  virtual unsigned char getCIntTypeWidth() const = 0;
-
 protected:
   mlir::MLIRContext &context;
   llvm::Triple triple;

diff  --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
index c24f3941aa639..1ad2526bd04bf 100644
--- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
@@ -100,14 +100,14 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
     // Convert ops in target-specific patterns.
     mod.walk([&](mlir::Operation *op) {
       if (auto call = mlir::dyn_cast<fir::CallOp>(op)) {
-        if (!hasPortableSignature(call.getFunctionType(), op))
+        if (!hasPortableSignature(call.getFunctionType()))
           convertCallOp(call);
       } else if (auto dispatch = mlir::dyn_cast<fir::DispatchOp>(op)) {
-        if (!hasPortableSignature(dispatch.getFunctionType(), op))
+        if (!hasPortableSignature(dispatch.getFunctionType()))
           convertCallOp(dispatch);
       } else if (auto addr = mlir::dyn_cast<fir::AddrOfOp>(op)) {
         if (addr.getType().isa<mlir::FunctionType>() &&
-            !hasPortableSignature(addr.getType(), op))
+            !hasPortableSignature(addr.getType()))
           convertAddrOp(addr);
       }
     });
@@ -456,23 +456,19 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
   /// then it is considered portable for any target, and this function will
   /// return `true`. Otherwise, the signature is not portable and `false` is
   /// returned.
-  bool hasPortableSignature(mlir::Type signature, mlir::Operation *op) {
+  bool hasPortableSignature(mlir::Type signature) {
     assert(signature.isa<mlir::FunctionType>());
     auto func = signature.dyn_cast<mlir::FunctionType>();
-    bool hasFirRuntime = op->hasAttrOfType<mlir::UnitAttr>(
-        fir::FIROpsDialect::getFirRuntimeAttrName());
     for (auto ty : func.getResults())
       if ((ty.isa<fir::BoxCharType>() && !noCharacterConversion) ||
-          (fir::isa_complex(ty) && !noComplexConversion) ||
-          (ty.isa<mlir::IntegerType>() && hasFirRuntime)) {
+          (fir::isa_complex(ty) && !noComplexConversion)) {
         LLVM_DEBUG(llvm::dbgs() << "rewrite " << signature << " for target\n");
         return false;
       }
     for (auto ty : func.getInputs())
       if (((ty.isa<fir::BoxCharType>() || fir::isCharacterProcedureTuple(ty)) &&
            !noCharacterConversion) ||
-          (fir::isa_complex(ty) && !noComplexConversion) ||
-          (ty.isa<mlir::IntegerType>() && hasFirRuntime)) {
+          (fir::isa_complex(ty) && !noComplexConversion)) {
         LLVM_DEBUG(llvm::dbgs() << "rewrite " << signature << " for target\n");
         return false;
       }
@@ -493,14 +489,13 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
   /// the immediately subsequent target code gen.
   void convertSignature(mlir::func::FuncOp func) {
     auto funcTy = func.getFunctionType().cast<mlir::FunctionType>();
-    if (hasPortableSignature(funcTy, func) && !hasHostAssociations(func))
+    if (hasPortableSignature(funcTy) && !hasHostAssociations(func))
       return;
     llvm::SmallVector<mlir::Type> newResTys;
     llvm::SmallVector<mlir::Type> newInTys;
     llvm::SmallVector<std::pair<unsigned, mlir::NamedAttribute>> savedAttrs;
     llvm::SmallVector<std::pair<unsigned, mlir::NamedAttribute>> extraAttrs;
     llvm::SmallVector<FixupTy> fixups;
-    llvm::SmallVector<std::pair<unsigned, mlir::NamedAttrList>, 1> resultAttrs;
 
     // Save argument attributes in case there is a shift so we can replace them
     // correctly.
@@ -527,22 +522,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
             else
               doComplexReturn(func, cmplx, newResTys, newInTys, fixups);
           })
-          .Case<mlir::IntegerType>([&](mlir::IntegerType intTy) {
-            auto m = specifics->integerArgumentType(func.getLoc(), intTy);
-            assert(m.size() == 1);
-            auto attr = std::get<fir::CodeGenSpecifics::Attributes>(m[0]);
-            auto retTy = std::get<mlir::Type>(m[0]);
-            std::size_t resId = newResTys.size();
-            llvm::StringRef extensionAttrName = attr.getIntExtensionAttrName();
-            if (!extensionAttrName.empty() &&
-                // TODO: we have to do the same for BIND(C) routines.
-                func->hasAttrOfType<mlir::UnitAttr>(
-                    fir::FIROpsDialect::getFirRuntimeAttrName()))
-              resultAttrs.emplace_back(
-                  resId, rewriter->getNamedAttr(extensionAttrName,
-                                                rewriter->getUnitAttr()));
-            newResTys.push_back(retTy);
-          })
           .Default([&](mlir::Type ty) { newResTys.push_back(ty); });
 
     // Saved potential shift in argument. Handling of result can add arguments
@@ -606,26 +585,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
               newInTys.push_back(ty);
             }
           })
-          .Case<mlir::IntegerType>([&](mlir::IntegerType intTy) {
-            auto m = specifics->integerArgumentType(func.getLoc(), intTy);
-            assert(m.size() == 1);
-            auto attr = std::get<fir::CodeGenSpecifics::Attributes>(m[0]);
-            auto argTy = std::get<mlir::Type>(m[0]);
-            auto argNo = newInTys.size();
-            llvm::StringRef extensionAttrName = attr.getIntExtensionAttrName();
-            if (!extensionAttrName.empty() &&
-                // TODO: we have to do the same for BIND(C) routines.
-                func->hasAttrOfType<mlir::UnitAttr>(
-                    fir::FIROpsDialect::getFirRuntimeAttrName())) {
-              fixups.emplace_back(FixupTy::Codes::ArgumentType, argNo,
-                                  [=](mlir::func::FuncOp func) {
-                                    func.setArgAttr(
-                                        argNo, extensionAttrName,
-                                        mlir::UnitAttr::get(func.getContext()));
-                                  });
-            }
-            newInTys.push_back(argTy);
-          })
           .Default([&](mlir::Type ty) { newInTys.push_back(ty); });
 
       if (func.getArgAttrOfType<mlir::UnitAttr>(index,
@@ -662,18 +621,14 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
         case FixupTy::Codes::ArgumentType: {
           // Argument is pass-by-value, but its type has likely been modified to
           // suit the target ABI convention.
-          auto oldArgTy =
-              fir::ReferenceType::get(oldArgTys[fixup.index - offset]);
-          // If type did not change, keep the original argument.
-          if (newInTys[fixup.index] == oldArgTy)
-            break;
-
           auto newArg = func.front().insertArgument(fixup.index,
                                                     newInTys[fixup.index], loc);
           rewriter->setInsertionPointToStart(&func.front());
           auto mem =
               rewriter->create<fir::AllocaOp>(loc, newInTys[fixup.index]);
           rewriter->create<fir::StoreOp>(loc, newArg, mem);
+          auto oldArgTy =
+              fir::ReferenceType::get(oldArgTys[fixup.index - offset]);
           auto cast = rewriter->create<fir::ConvertOp>(loc, oldArgTy, mem);
           mlir::Value load = rewriter->create<fir::LoadOp>(loc, cast);
           func.getArgument(fixup.index + 1).replaceAllUsesWith(load);
@@ -802,10 +757,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
       func.setArgAttr(extraAttr.first, extraAttr.second.getName(),
                       extraAttr.second.getValue());
 
-    for (auto [resId, resAttrList] : resultAttrs)
-      for (mlir::NamedAttribute resAttr : resAttrList)
-        func.setResultAttr(resId, resAttr.getName(), resAttr.getValue());
-
     // Replace attributes to the correct argument if there was an argument shift
     // to the right.
     if (argumentShift > 0) {

diff  --git a/flang/test/Fir/target-rewrite-integer.fir b/flang/test/Fir/target-rewrite-integer.fir
deleted file mode 100644
index b7426acf06238..0000000000000
--- a/flang/test/Fir/target-rewrite-integer.fir
+++ /dev/null
@@ -1,77 +0,0 @@
-// RUN: fir-opt --split-input-file --target-rewrite="target=i386-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=I32,ALL
-// RUN: fir-opt --split-input-file --target-rewrite="target=x86_64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=X64,ALL
-// RUN: fir-opt --split-input-file --target-rewrite="target=aarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=AARCH64,ALL
-// RUN: fir-opt --split-input-file --target-rewrite="target=powerpc64le-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=PPC,ALL
-// RUN: fir-opt --split-input-file --target-rewrite="target=sparc64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=SPARCV9,ALL
-// RUN: fir-opt --split-input-file --target-rewrite="target=sparcv9-sun-solaris2.11" %s | FileCheck %s --check-prefixes=SPARCV9,ALL
-
-// -----
-
-// subroutine test_i1(x)
-//   logical x
-//   print *, x
-// end subroutine test_i1
-
-// ALL-LABEL: @_QPtest_i1
-// I32: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext})
-// X64: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext})
-// AARCH64: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext})
-// PPC: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext})
-// SPARCV9: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext})
-func.func @_QPtest_i1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) {
-  %c3_i32 = arith.constant 3 : i32
-  %c-1_i32 = arith.constant -1 : i32
-  %0 = fir.address_of(@_QQcl.2E2F746573742E66393000) : !fir.ref<!fir.char<1,11>>
-  %1 = fir.convert %0 : (!fir.ref<!fir.char<1,11>>) -> !fir.ref<i8>
-  %2 = fir.call @_FortranAioBeginExternalListOutput(%c-1_i32, %1, %c3_i32) : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-  %3 = fir.load %arg0 : !fir.ref<!fir.logical<4>>
-  %4 = fir.convert %3 : (!fir.logical<4>) -> i1
-  %5 = fir.call @_FortranAioOutputLogical(%2, %4) : (!fir.ref<i8>, i1) -> i1
-  %6 = fir.call @_FortranAioEndIoStatement(%2) : (!fir.ref<i8>) -> i32
-  return
-}
-func.func private @_FortranAioBeginExternalListOutput(i32, !fir.ref<i8>, i32) -> !fir.ref<i8> attributes {fir.io, fir.runtime}
-fir.global linkonce @_QQcl.2E2F746573742E66393000 constant : !fir.char<1,11> {
-  %0 = fir.string_lit "./test.f90\00"(11) : !fir.char<1,11>
-  fir.has_value %0 : !fir.char<1,11>
-}
-func.func private @_FortranAioOutputLogical(!fir.ref<i8>, i1) -> i1 attributes {fir.io, fir.runtime}
-func.func private @_FortranAioEndIoStatement(!fir.ref<i8>) -> i32 attributes {fir.io, fir.runtime}
-
-// -----
-
-// Manually created test with 'si1' argument/return type.
-// Flang does not use 'si1' type currently.
-
-// ALL-LABEL: @_QPtest_si1
-// I32: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext})
-// X64: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext})
-// AARCH64: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext})
-// PPC: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext})
-// SPARCV9: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext})
-func.func @_QPtest_si1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) {
-  %0 = fir.load %arg0 : !fir.ref<!fir.logical<4>>
-  %1 = fir.convert %0 : (!fir.logical<4>) -> si1
-  %2 = fir.call @_SomeFunc_si1(%1) : (si1) -> si1
-  return
-}
-func.func private @_SomeFunc_si1(si1) -> si1 attributes {fir.runtime}
-
-// -----
-
-// Manually created test with 'ui1' argument/return type.
-// Flang does not use 'ui1' type currently.
-
-// ALL-LABEL: @_QPtest_ui1
-// I32: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext})
-// X64: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext})
-// AARCH64: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext})
-// PPC: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext})
-// SPARCV9: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext})
-func.func @_QPtest_ui1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) {
-  %0 = fir.load %arg0 : !fir.ref<!fir.logical<4>>
-  %1 = fir.convert %0 : (!fir.logical<4>) -> ui1
-  %2 = fir.call @_SomeFunc_ui1(%1) : (ui1) -> ui1
-  return
-}
-func.func private @_SomeFunc_ui1(ui1) -> ui1 attributes {fir.runtime}


        


More information about the flang-commits mailing list