[flang-commits] [flang] [flang] Remove dead code and update test (NFC) (PR #73004)

via flang-commits flang-commits at lists.llvm.org
Tue Nov 21 08:14:44 PST 2023


https://github.com/kkwli created https://github.com/llvm/llvm-project/pull/73004

OutputUnformattedBlock and InputUnformattedBlock are not used.

>From cfc1c5a0d717ff0fb3bfca2d68cf5171e2b5ba19 Mon Sep 17 00:00:00 2001
From: Kelvin Li <kli at ca.ibm.com>
Date: Mon, 20 Nov 2023 23:46:24 -0500
Subject: [PATCH 1/2] [flang] Remove dead code and update test (NFC)

OutputUnformattedBlock and InputUnformattedBlock are not used.
---
 flang/include/flang/Runtime/io-api.h       |   5 -
 flang/lib/Lower/IO.cpp                     |   4 +-
 flang/runtime/io-api.cpp                   |  33 -------
 flang/unittests/Runtime/ExternalIOTest.cpp | 105 ++++++++++-----------
 4 files changed, 53 insertions(+), 94 deletions(-)

diff --git a/flang/include/flang/Runtime/io-api.h b/flang/include/flang/Runtime/io-api.h
index e298ab4c53d4ae5..41574e3bb80ad3b 100644
--- a/flang/include/flang/Runtime/io-api.h
+++ b/flang/include/flang/Runtime/io-api.h
@@ -244,11 +244,6 @@ bool IONAME(SetSign)(Cookie, const char *, std::size_t);
 // and avoid the following items when they might crash.
 bool IONAME(OutputDescriptor)(Cookie, const Descriptor &);
 bool IONAME(InputDescriptor)(Cookie, const Descriptor &);
-// Contiguous transfers for unformatted I/O
-bool IONAME(OutputUnformattedBlock)(
-    Cookie, const char *, std::size_t, std::size_t elementBytes);
-bool IONAME(InputUnformattedBlock)(
-    Cookie, char *, std::size_t, std::size_t elementBytes);
 // Formatted (including list directed) I/O data items
 bool IONAME(OutputInteger8)(Cookie, std::int8_t);
 bool IONAME(OutputInteger16)(Cookie, std::int16_t);
diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp
index 94135bb570ffbc1..e53486bfca0722f 100644
--- a/flang/lib/Lower/IO.cpp
+++ b/flang/lib/Lower/IO.cpp
@@ -101,7 +101,7 @@ static constexpr std::tuple<
     mkIOKey(InputAscii), mkIOKey(InputComplex32), mkIOKey(InputComplex64),
     mkIOKey(InputDerivedType), mkIOKey(InputDescriptor), mkIOKey(InputInteger),
     mkIOKey(InputLogical), mkIOKey(InputNamelist), mkIOKey(InputReal32),
-    mkIOKey(InputReal64), mkIOKey(InputUnformattedBlock),
+    mkIOKey(InputReal64),
     mkIOKey(InquireCharacter), mkIOKey(InquireInteger64),
     mkIOKey(InquireLogical), mkIOKey(InquirePendingId), mkIOKey(OutputAscii),
     mkIOKey(OutputComplex32), mkIOKey(OutputComplex64),
@@ -109,7 +109,7 @@ static constexpr std::tuple<
     mkIOKey(OutputInteger8), mkIOKey(OutputInteger16), mkIOKey(OutputInteger32),
     mkIOKey(OutputInteger64), mkIOKey(OutputInteger128), mkIOKey(OutputLogical),
     mkIOKey(OutputNamelist), mkIOKey(OutputReal32), mkIOKey(OutputReal64),
-    mkIOKey(OutputUnformattedBlock), mkIOKey(SetAccess), mkIOKey(SetAction),
+    mkIOKey(SetAccess), mkIOKey(SetAction),
     mkIOKey(SetAdvance), mkIOKey(SetAsynchronous), mkIOKey(SetBlank),
     mkIOKey(SetCarriagecontrol), mkIOKey(SetConvert), mkIOKey(SetDecimal),
     mkIOKey(SetDelim), mkIOKey(SetEncoding), mkIOKey(SetFile), mkIOKey(SetForm),
diff --git a/flang/runtime/io-api.cpp b/flang/runtime/io-api.cpp
index 2fc530c7431a50d..9a69a262464123c 100644
--- a/flang/runtime/io-api.cpp
+++ b/flang/runtime/io-api.cpp
@@ -1135,39 +1135,6 @@ bool IONAME(InputDescriptor)(Cookie cookie, const Descriptor &descriptor) {
   return descr::DescriptorIO<Direction::Input>(*cookie, descriptor);
 }
 
-bool IONAME(OutputUnformattedBlock)(Cookie cookie, const char *x,
-    std::size_t length, std::size_t elementBytes) {
-  IoStatementState &io{*cookie};
-  if (auto *unf{io.get_if<
-          ExternalUnformattedIoStatementState<Direction::Output>>()}) {
-    return unf->Emit(x, length, elementBytes);
-  } else if (auto *inq{io.get_if<InquireIOLengthState>()}) {
-    return inq->Emit(x, length, elementBytes);
-  } else if (!io.get_if<ErroneousIoStatementState>()) {
-    io.GetIoErrorHandler().Crash("OutputUnformattedBlock() called for an I/O "
-                                 "statement that is not unformatted output");
-  }
-  return false;
-}
-
-bool IONAME(InputUnformattedBlock)(
-    Cookie cookie, char *x, std::size_t length, std::size_t elementBytes) {
-  IoStatementState &io{*cookie};
-  IoErrorHandler &handler{io.GetIoErrorHandler()};
-  io.BeginReadingRecord();
-  if (handler.InError()) {
-    return false;
-  }
-  if (auto *unf{
-          io.get_if<ExternalUnformattedIoStatementState<Direction::Input>>()}) {
-    return unf->Receive(x, length, elementBytes);
-  } else if (!io.get_if<ErroneousIoStatementState>()) {
-    handler.Crash("InputUnformattedBlock() called for an I/O statement that is "
-                  "not unformatted input");
-  }
-  return false;
-}
-
 bool IONAME(OutputInteger8)(Cookie cookie, std::int8_t n) {
   if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputInteger8")) {
     return false;
diff --git a/flang/unittests/Runtime/ExternalIOTest.cpp b/flang/unittests/Runtime/ExternalIOTest.cpp
index 4f08505f05d0ad4..e863194d44827c2 100644
--- a/flang/unittests/Runtime/ExternalIOTest.cpp
+++ b/flang/unittests/Runtime/ExternalIOTest.cpp
@@ -43,11 +43,15 @@ TEST(ExternalIOTests, TestDirectUnformatted) {
   ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
       << "EndIoStatement() for OpenNewUnit";
 
+  StaticDescriptor<0> staticDescriptor;
+  Descriptor &desc{staticDescriptor.descriptor()};
+  desc.Establish(TypeCode{CFI_type_int8_t}, recl, &buffer, 0);
+  desc.Check();
+
   // INQUIRE(IOLENGTH=) j
   io = IONAME(BeginInquireIoLength)(__FILE__, __LINE__);
-  ASSERT_TRUE(IONAME(OutputUnformattedBlock)(
-      io, reinterpret_cast<const char *>(&buffer), recl, 1))
-      << "OutputUnformattedBlock() for InquireIoLength";
+  ASSERT_TRUE(IONAME(OutputDescriptor)(io, desc))
+      << "OutputDescriptor() for InquireIoLength";
   ASSERT_EQ(IONAME(GetIoLength)(io), recl) << "GetIoLength";
   ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
       << "EndIoStatement() for InquireIoLength";
@@ -59,24 +63,23 @@ TEST(ExternalIOTests, TestDirectUnformatted) {
     ASSERT_TRUE(IONAME(SetRec)(io, j)) << "SetRec(" << j << ')';
 
     buffer = j;
-    ASSERT_TRUE(IONAME(OutputUnformattedBlock)(
-        io, reinterpret_cast<const char *>(&buffer), 1, recl))
-        << "OutputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(OutputDescriptor)(io, desc))
+        << "OutputDescriptor() for Write";
 
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for OutputUnformattedBlock";
+        << "EndIoStatement() for Write";
   }
 
   for (int j{records}; j >= 1; --j) {
+    buffer = -1;
     // READ(UNIT=unit,REC=j) n
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
     ASSERT_TRUE(IONAME(SetRec)(io, j)) << "SetRec(" << j << ')';
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(
-        io, reinterpret_cast<char *>(&buffer), 1, recl))
-        << "InputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() for Read";
 
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for InputUnformattedBlock";
+        << "EndIoStatement() for Read";
 
     ASSERT_EQ(buffer, j) << "Read back " << buffer
                          << " from direct unformatted record " << j
@@ -108,17 +111,21 @@ TEST(ExternalIOTests, TestDirectUnformattedSwapped) {
   ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
       << "EndIoStatement() for OpenNewUnit";
 
+  StaticDescriptor<0> staticDescriptor;
+  Descriptor &desc{staticDescriptor.descriptor()};
+  desc.Establish(TypeCode{CFI_type_int64_t}, recl, &buffer, 0);
+  desc.Check();
+
   static constexpr int records{10};
   for (int j{1}; j <= records; ++j) {
     // WRITE(UNIT=unit,REC=j) j
     io = IONAME(BeginUnformattedOutput)(unit, __FILE__, __LINE__);
     ASSERT_TRUE(IONAME(SetRec)(io, j)) << "SetRec(" << j << ')';
     buffer = j;
-    ASSERT_TRUE(IONAME(OutputUnformattedBlock)(
-        io, reinterpret_cast<const char *>(&buffer), recl, recl))
-        << "OutputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(OutputDescriptor)(io, desc))
+        << "OutputDescriptor() for Write";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for OutputUnformattedBlock";
+        << "EndIoStatement() for Write";
   }
 
   // OPEN(UNIT=unit,STATUS='OLD',CONVERT='SWAP')
@@ -132,11 +139,10 @@ TEST(ExternalIOTests, TestDirectUnformattedSwapped) {
     // READ(UNIT=unit,REC=j) n
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
     ASSERT_TRUE(IONAME(SetRec)(io, j)) << "SetRec(" << j << ')';
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(
-        io, reinterpret_cast<char *>(&buffer), recl, recl))
-        << "InputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() for Read";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for InputUnformattedBlock";
+        << "EndIoStatement() for Read";
     ASSERT_EQ(buffer >> 56, j)
         << "Read back " << (buffer >> 56) << " from direct unformatted record "
         << j << ", expected " << j << '\n';
@@ -169,17 +175,6 @@ TEST(ExternalIOTests, TestSequentialFixedUnformatted) {
   ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
       << "EndIoStatement() for OpenNewUnit";
 
-  // INQUIRE(IOLENGTH=) j, ...
-  io = IONAME(BeginInquireIoLength)(__FILE__, __LINE__);
-  for (int j{1}; j <= 3; ++j) {
-    ASSERT_TRUE(IONAME(OutputUnformattedBlock)(
-        io, reinterpret_cast<const char *>(&buffer), recl, 1))
-        << "OutputUnformattedBlock() for InquireIoLength";
-  }
-  ASSERT_EQ(IONAME(GetIoLength)(io), 3 * recl) << "GetIoLength";
-  ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-      << "EndIoStatement() for InquireIoLength";
-
   // INQUIRE(IOLENGTH=) j, ...
   StaticDescriptor<0> staticDescriptor;
   Descriptor &desc{staticDescriptor.descriptor()};
@@ -200,11 +195,10 @@ TEST(ExternalIOTests, TestSequentialFixedUnformatted) {
     // DO J=1,RECORDS; WRITE(UNIT=unit) j; END DO
     io = IONAME(BeginUnformattedOutput)(unit, __FILE__, __LINE__);
     buffer = j;
-    ASSERT_TRUE(IONAME(OutputUnformattedBlock)(
-        io, reinterpret_cast<const char *>(&buffer), recl, recl))
-        << "OutputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(OutputDescriptor)(io, desc))
+        << "OutputDescriptor() for Write";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for OutputUnformattedBlock";
+        << "EndIoStatement() for WRITE";
   }
 
   // REWIND(UNIT=unit)
@@ -215,11 +209,10 @@ TEST(ExternalIOTests, TestSequentialFixedUnformatted) {
   for (int j{1}; j <= records; ++j) {
     // DO J=1,RECORDS; READ(UNIT=unit) n; check n; END DO
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(
-        io, reinterpret_cast<char *>(&buffer), recl, recl))
-        << "InputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() for Read";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for InputUnformattedBlock";
+        << "EndIoStatement() for Read";
     ASSERT_EQ(buffer, j) << "Read back " << buffer
                          << " from sequential fixed unformatted record " << j
                          << ", expected " << j << '\n';
@@ -232,11 +225,10 @@ TEST(ExternalIOTests, TestSequentialFixedUnformatted) {
         << "EndIoStatement() for Backspace (before read)";
     // READ(UNIT=unit) n
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(
-        io, reinterpret_cast<char *>(&buffer), recl, recl))
-        << "InputUnformattedBlock()";
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() for Read";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for InputUnformattedBlock";
+        << "EndIoStatement() for Read";
     ASSERT_EQ(buffer, j) << "Read back " << buffer
                          << " from sequential fixed unformatted record " << j
                          << " after backspacing, expected " << j << '\n';
@@ -275,15 +267,18 @@ TEST(ExternalIOTests, TestSequentialVariableUnformatted) {
     buffer[j] = j;
   }
 
+  StaticDescriptor<0> staticDescriptor;
+  Descriptor &desc{staticDescriptor.descriptor()};
+
   for (int j{1}; j <= records; ++j) {
     // DO J=1,RECORDS; WRITE(UNIT=unit) BUFFER(0:j); END DO
     io = IONAME(BeginUnformattedOutput)(unit, __FILE__, __LINE__);
-    ASSERT_TRUE(IONAME(OutputUnformattedBlock)(io,
-        reinterpret_cast<const char *>(&buffer), j * sizeof *buffer,
-        sizeof *buffer))
-        << "OutputUnformattedBlock()";
+    desc.Establish(TypeCode{sizeof *buffer}, j * sizeof *buffer, buffer, 0);
+    desc.Check();
+    ASSERT_TRUE(IONAME(OutputDescriptor)(io, desc))
+        << "OutputDescriptor() for Write";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for OutputUnformattedBlock";
+        << "EndIoStatement() for Write";
   }
 
   // REWIND(UNIT=unit)
@@ -293,11 +288,12 @@ TEST(ExternalIOTests, TestSequentialVariableUnformatted) {
   for (int j{1}; j <= records; ++j) {
     // DO J=1,RECORDS; READ(UNIT=unit) n; check n; END DO
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(io,
-        reinterpret_cast<char *>(&buffer), j * sizeof *buffer, sizeof *buffer))
-        << "InputUnformattedBlock()";
+    desc.Establish(TypeCode{sizeof *buffer}, j * sizeof *buffer, buffer, 0);
+    desc.Check();
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() for Read";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
-        << "EndIoStatement() for InputUnformattedBlock";
+        << "EndIoStatement() for Read";
     for (int k{0}; k < j; ++k) {
       ASSERT_EQ(buffer[k], k) << "Read back [" << k << "]=" << buffer[k]
                               << " from direct unformatted record " << j
@@ -312,9 +308,10 @@ TEST(ExternalIOTests, TestSequentialVariableUnformatted) {
         << "EndIoStatement() for Backspace (before read)";
     // READ(unit=unit) n; check
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
-    ASSERT_TRUE(IONAME(InputUnformattedBlock)(io,
-        reinterpret_cast<char *>(&buffer), j * sizeof *buffer, sizeof *buffer))
-        << "InputUnformattedBlock()";
+    desc.Establish(TypeCode{sizeof *buffer}, j * sizeof *buffer, buffer, 0);
+    desc.Check();
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor()";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
         << "EndIoStatement() for InputUnformattedBlock";
     for (int k{0}; k < j; ++k) {

>From 5a131d179a64b63f76bc18554980b0c5434bc136 Mon Sep 17 00:00:00 2001
From: Kelvin Li <kli at ca.ibm.com>
Date: Tue, 21 Nov 2023 11:12:08 -0500
Subject: [PATCH 2/2] fix format

---
 flang/lib/Lower/IO.cpp                     | 15 +++++++--------
 flang/unittests/Runtime/ExternalIOTest.cpp |  3 +--
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp
index e53486bfca0722f..4186d6158fb1d04 100644
--- a/flang/lib/Lower/IO.cpp
+++ b/flang/lib/Lower/IO.cpp
@@ -101,20 +101,19 @@ static constexpr std::tuple<
     mkIOKey(InputAscii), mkIOKey(InputComplex32), mkIOKey(InputComplex64),
     mkIOKey(InputDerivedType), mkIOKey(InputDescriptor), mkIOKey(InputInteger),
     mkIOKey(InputLogical), mkIOKey(InputNamelist), mkIOKey(InputReal32),
-    mkIOKey(InputReal64),
-    mkIOKey(InquireCharacter), mkIOKey(InquireInteger64),
+    mkIOKey(InputReal64), mkIOKey(InquireCharacter), mkIOKey(InquireInteger64),
     mkIOKey(InquireLogical), mkIOKey(InquirePendingId), mkIOKey(OutputAscii),
     mkIOKey(OutputComplex32), mkIOKey(OutputComplex64),
     mkIOKey(OutputDerivedType), mkIOKey(OutputDescriptor),
     mkIOKey(OutputInteger8), mkIOKey(OutputInteger16), mkIOKey(OutputInteger32),
     mkIOKey(OutputInteger64), mkIOKey(OutputInteger128), mkIOKey(OutputLogical),
     mkIOKey(OutputNamelist), mkIOKey(OutputReal32), mkIOKey(OutputReal64),
-    mkIOKey(SetAccess), mkIOKey(SetAction),
-    mkIOKey(SetAdvance), mkIOKey(SetAsynchronous), mkIOKey(SetBlank),
-    mkIOKey(SetCarriagecontrol), mkIOKey(SetConvert), mkIOKey(SetDecimal),
-    mkIOKey(SetDelim), mkIOKey(SetEncoding), mkIOKey(SetFile), mkIOKey(SetForm),
-    mkIOKey(SetPad), mkIOKey(SetPos), mkIOKey(SetPosition), mkIOKey(SetRec),
-    mkIOKey(SetRecl), mkIOKey(SetRound), mkIOKey(SetSign), mkIOKey(SetStatus)>
+    mkIOKey(SetAccess), mkIOKey(SetAction), mkIOKey(SetAdvance),
+    mkIOKey(SetAsynchronous), mkIOKey(SetBlank), mkIOKey(SetCarriagecontrol),
+    mkIOKey(SetConvert), mkIOKey(SetDecimal), mkIOKey(SetDelim),
+    mkIOKey(SetEncoding), mkIOKey(SetFile), mkIOKey(SetForm), mkIOKey(SetPad),
+    mkIOKey(SetPos), mkIOKey(SetPosition), mkIOKey(SetRec), mkIOKey(SetRecl),
+    mkIOKey(SetRound), mkIOKey(SetSign), mkIOKey(SetStatus)>
     newIOTable;
 } // namespace Fortran::lower
 
diff --git a/flang/unittests/Runtime/ExternalIOTest.cpp b/flang/unittests/Runtime/ExternalIOTest.cpp
index e863194d44827c2..76fdb6cb68ae952 100644
--- a/flang/unittests/Runtime/ExternalIOTest.cpp
+++ b/flang/unittests/Runtime/ExternalIOTest.cpp
@@ -310,8 +310,7 @@ TEST(ExternalIOTests, TestSequentialVariableUnformatted) {
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
     desc.Establish(TypeCode{sizeof *buffer}, j * sizeof *buffer, buffer, 0);
     desc.Check();
-    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
-        << "InputDescriptor()";
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc)) << "InputDescriptor()";
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
         << "EndIoStatement() for InputUnformattedBlock";
     for (int k{0}; k < j; ++k) {



More information about the flang-commits mailing list