diff --git a/flang/include/flang/Runtime/io-api.h b/flang/include/flang/Runtime/io-api.h index 41574e3bb80ad..0277f0ea9e97e 100644 --- a/flang/include/flang/Runtime/io-api.h +++ b/flang/include/flang/Runtime/io-api.h @@ -14,6 +14,7 @@ #include "flang/Common/uint128.h" #include "flang/Runtime/entry-names.h" #include "flang/Runtime/iostat.h" +#include "flang/Runtime/magic-numbers.h" #include #include @@ -29,7 +30,9 @@ class IoStatementState; using Cookie = IoStatementState *; using ExternalUnit = int; using AsynchronousId = int; -static constexpr ExternalUnit DefaultUnit{-1}; // READ(*), WRITE(*), PRINT + +static constexpr ExternalUnit DefaultOutputUnit{FORTRAN_DEFAULT_OUTPUT_UNIT}; +static constexpr ExternalUnit DefaultInputUnit{FORTRAN_DEFAULT_INPUT_UNIT}; // INQUIRE specifiers are encoded as simple base-26 packings of // the spellings of their keywords. @@ -57,7 +60,8 @@ extern "C" { // These functions initiate data transfer statements (READ, WRITE, PRINT). // Example: PRINT *, 666 is implemented as the series of calls: -// Cookie cookie{BeginExternalListOutput(DefaultUnit,__FILE__,__LINE__)}; +// Cookie cookie{BeginExternalListOutput(DefaultOutputUnit, +// __FILE__, __LINE__)}; // OutputInteger32(cookie, 666); // EndIoStatement(cookie); // Formatted I/O with explicit formats can supply the format as a @@ -135,19 +139,21 @@ enum Iostat IONAME(CheckUnitNumberInRange128)(common::int128_t unit, const char *sourceFile = nullptr, int sourceLine = 0); // External synchronous I/O initiation -Cookie IONAME(BeginExternalListOutput)(ExternalUnit = DefaultUnit, +Cookie IONAME(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr, int sourceLine = 0); -Cookie IONAME(BeginExternalListInput)(ExternalUnit = DefaultUnit, +Cookie IONAME(BeginExternalListInput)(ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr, int sourceLine = 0); Cookie IONAME(BeginExternalFormattedOutput)(const char *format, std::size_t, - const Descriptor *formatDescriptor = nullptr, ExternalUnit = DefaultUnit, - const char *sourceFile = nullptr, int sourceLine = 0); + const Descriptor *formatDescriptor = nullptr, + ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr, + int sourceLine = 0); Cookie IONAME(BeginExternalFormattedInput)(const char *format, std::size_t, - const Descriptor *formatDescriptor = nullptr, ExternalUnit = DefaultUnit, - const char *sourceFile = nullptr, int sourceLine = 0); -Cookie IONAME(BeginUnformattedOutput)(ExternalUnit = DefaultUnit, + const Descriptor *formatDescriptor = nullptr, + ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IONAME(BeginUnformattedOutput)(ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr, int sourceLine = 0); -Cookie IONAME(BeginUnformattedInput)(ExternalUnit = DefaultUnit, +Cookie IONAME(BeginUnformattedInput)(ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr, int sourceLine = 0); // WAIT(ID=) @@ -190,7 +196,7 @@ Cookie IONAME(BeginInquireIoLength)( // This call makes the runtime library defer those particular error/end // conditions to the EndIoStatement() call rather than terminating // the image. E.g., for READ(*,*,END=666) A, B, (C(J),J=1,N) -// Cookie cookie{BeginExternalListInput(DefaultUnit,__FILE__,__LINE__)}; +// Cookie cookie{BeginExternalListInput(DefaultInputUnit,__FILE__,__LINE__)}; // EnableHandlers(cookie, false, false, true /*END=*/, false); // if (InputReal64(cookie, &A)) { // if (InputReal64(cookie, &B)) { diff --git a/flang/include/flang/Runtime/magic-numbers.h b/flang/include/flang/Runtime/magic-numbers.h index d00d5027d4ed2..196b13ad3755b 100644 --- a/flang/include/flang/Runtime/magic-numbers.h +++ b/flang/include/flang/Runtime/magic-numbers.h @@ -27,6 +27,10 @@ start at 100 so as to never conflict with those codes. #ifndef FORTRAN_RUNTIME_MAGIC_NUMBERS_H_ #define FORTRAN_RUNTIME_MAGIC_NUMBERS_H_ +#define FORTRAN_DEFAULT_OUTPUT_UNIT 6 +#define FORTRAN_DEFAULT_INPUT_UNIT 5 +#define FORTRAN_ERROR_UNIT 0 + #define FORTRAN_RUNTIME_IOSTAT_END (-1) #define FORTRAN_RUNTIME_IOSTAT_EOR (-2) #define FORTRAN_RUNTIME_IOSTAT_FLUSH (-3) diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp index a60ca92a8733e..3933ebeb9b3cc 100644 --- a/flang/lib/Lower/IO.cpp +++ b/flang/lib/Lower/IO.cpp @@ -1850,24 +1850,25 @@ static mlir::Value genIOUnit(Fortran::lower::AbstractConverter &converter, mlir::Location loc, const Fortran::parser::IoUnit *iounit, mlir::Type ty, ConditionSpecInfo &csi, - Fortran::lower::StatementContext &stmtCtx) { + Fortran::lower::StatementContext &stmtCtx, + int defaultUnitNumber) { auto &builder = converter.getFirOpBuilder(); if (iounit) if (auto *e = std::get_if(&iounit->u)) return genIOUnitNumber(converter, loc, Fortran::semantics::GetExpr(*e), ty, csi, stmtCtx); return builder.create( - loc, builder.getIntegerAttr(ty, Fortran::runtime::io::DefaultUnit)); + loc, builder.getIntegerAttr(ty, defaultUnitNumber)); } template -static mlir::Value getIOUnit(Fortran::lower::AbstractConverter &converter, - mlir::Location loc, const A &stmt, mlir::Type ty, - ConditionSpecInfo &csi, - Fortran::lower::StatementContext &stmtCtx) { +static mlir::Value +getIOUnit(Fortran::lower::AbstractConverter &converter, mlir::Location loc, + const A &stmt, mlir::Type ty, ConditionSpecInfo &csi, + Fortran::lower::StatementContext &stmtCtx, int defaultUnitNumber) { const Fortran::parser::IoUnit *iounit = stmt.iounit ? &*stmt.iounit : getIOControl(stmt); - return genIOUnit(converter, loc, iounit, ty, csi, stmtCtx); + return genIOUnit(converter, loc, iounit, ty, csi, stmtCtx, defaultUnitNumber); } //===----------------------------------------------------------------------===// // Generators for each IO statement type. @@ -2091,7 +2092,7 @@ getBeginDataTransferFunc(mlir::Location loc, fir::FirOpBuilder &builder, } /// Generate the arguments of a begin data transfer statement call. -template +template void genBeginDataTransferCallArgs( llvm::SmallVectorImpl &ioArgs, Fortran::lower::AbstractConverter &converter, mlir::Location loc, @@ -2149,14 +2150,14 @@ void genBeginDataTransferCallArgs( TODO(loc, "asynchronous"); maybeGetFormatArgs(); ioArgs.push_back(getIOUnit(converter, loc, stmt, - ioFuncTy.getInput(ioArgs.size()), csi, - stmtCtx)); + ioFuncTy.getInput(ioArgs.size()), csi, stmtCtx, + defaultUnitNumber)); } } else { // PRINT - maybe explicit format; default unit maybeGetFormatArgs(); ioArgs.push_back(builder.create( loc, builder.getIntegerAttr(ioFuncTy.getInput(ioArgs.size()), - Fortran::runtime::io::DefaultUnit))); + defaultUnitNumber))); } // File name and line number are always the last two arguments. ioArgs.push_back( @@ -2193,7 +2194,9 @@ genDataTransferStmt(Fortran::lower::AbstractConverter &converter, loc, builder, isFormatted, isList || isNml, isInternal, isInternalWithDesc, isAsync); llvm::SmallVector ioArgs; - genBeginDataTransferCallArgs( + genBeginDataTransferCallArgs< + hasIOCtrl, isInput ? Fortran::runtime::io::DefaultInputUnit + : Fortran::runtime::io::DefaultOutputUnit>( ioArgs, converter, loc, stmt, ioFunc.getFunctionType(), isFormatted, isList || isNml, isInternal, isAsync, descRef, csi, stmtCtx); mlir::Value cookie = diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90 index 61d8a07e61133..6ee153592e1c6 100644 --- a/flang/module/iso_fortran_env.f90 +++ b/flang/module/iso_fortran_env.f90 @@ -9,7 +9,7 @@ ! See Fortran 2018, clause 16.10.2 ! TODO: These are placeholder values so that some tests can be run. -include '../include/flang/Runtime/magic-numbers.h' ! IOSTAT values +include '../include/flang/Runtime/magic-numbers.h' module iso_fortran_env @@ -130,8 +130,9 @@ module iso_fortran_env integer, parameter :: current_team = -1, initial_team = -2, parent_team = -3 - integer, parameter :: input_unit = 5, output_unit = 6 - integer, parameter :: error_unit = 0 + integer, parameter :: output_unit = FORTRAN_DEFAULT_OUTPUT_UNIT + integer, parameter :: input_unit = FORTRAN_DEFAULT_INPUT_UNIT + integer, parameter :: error_unit = FORTRAN_ERROR_UNIT integer, parameter :: iostat_end = FORTRAN_RUNTIME_IOSTAT_END integer, parameter :: iostat_eor = FORTRAN_RUNTIME_IOSTAT_EOR integer, parameter :: iostat_inquire_internal_unit = & diff --git a/flang/runtime/io-api.cpp b/flang/runtime/io-api.cpp index 9a69a26246412..79d43c7cc884f 100644 --- a/flang/runtime/io-api.cpp +++ b/flang/runtime/io-api.cpp @@ -185,9 +185,6 @@ template class STATE, typename... A> Cookie BeginExternalListIO( int unitNumber, const char *sourceFile, int sourceLine, A &&...xs) { Terminator terminator{sourceFile, sourceLine}; - if (unitNumber == DefaultUnit) { - unitNumber = DIR == Direction::Input ? 5 : 6; - } Cookie errorCookie{nullptr}; ExternalFileUnit *unit{GetOrCreateUnit( unitNumber, DIR, false /*!unformatted*/, terminator, errorCookie)}; @@ -246,9 +243,6 @@ Cookie BeginExternalFormattedIO(const char *format, std::size_t formatLength, const Descriptor *formatDescriptor, ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { Terminator terminator{sourceFile, sourceLine}; - if (unitNumber == DefaultUnit) { - unitNumber = DIR == Direction::Input ? 5 : 6; - } Cookie errorCookie{nullptr}; ExternalFileUnit *unit{GetOrCreateUnit( unitNumber, DIR, false /*!unformatted*/, terminator, errorCookie)}; @@ -761,7 +755,8 @@ bool IONAME(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) { IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetAccess() called when not in an OPEN statement"); } @@ -796,7 +791,8 @@ bool IONAME(SetAction)(Cookie cookie, const char *keyword, std::size_t length) { IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetAction() called when not in an OPEN statement"); } @@ -852,7 +848,8 @@ bool IONAME(SetAsynchronous)( handler.SignalError(IostatBadAsynchronous); } } - } else if (!io.get_if()) { + } else if (!io.get_if() && + !io.get_if()) { handler.Crash("SetAsynchronous() called when not in an OPEN or external " "I/O statement"); } @@ -864,7 +861,8 @@ bool IONAME(SetCarriagecontrol)( IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetCarriageControl() called when not in an OPEN statement"); } @@ -895,7 +893,8 @@ bool IONAME(SetConvert)( IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetConvert() called when not in an OPEN statement"); } @@ -919,7 +918,8 @@ bool IONAME(SetEncoding)( IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetEncoding() called when not in an OPEN statement"); } @@ -949,7 +949,8 @@ bool IONAME(SetForm)(Cookie cookie, const char *keyword, std::size_t length) { IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetForm() called when not in an OPEN statement"); } @@ -977,7 +978,8 @@ bool IONAME(SetPosition)( IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetPosition() called when not in an OPEN statement"); } @@ -1008,7 +1010,8 @@ bool IONAME(SetRecl)(Cookie cookie, std::size_t n) { IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetRecl() called when not in an OPEN statement"); } @@ -1093,7 +1096,8 @@ bool IONAME(SetFile)(Cookie cookie, const char *path, std::size_t chars) { } open->set_path(path, chars); return true; - } else if (!io.get_if()) { + } else if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "SetFile() called when not in an OPEN statement"); } @@ -1104,7 +1108,8 @@ bool IONAME(GetNewUnit)(Cookie cookie, int &unit, int kind) { IoStatementState &io{*cookie}; auto *open{io.get_if()}; if (!open) { - if (!io.get_if()) { + if (!io.get_if() && + !io.get_if()) { io.GetIoErrorHandler().Crash( "GetNewUnit() called when not in an OPEN statement"); } @@ -1361,7 +1366,8 @@ std::size_t IONAME(GetSize)(Cookie cookie) { if (const auto *formatted{ io.get_if>()}) { return formatted->GetEditDescriptorChars(); - } else if (!io.get_if()) { + } else if (!io.get_if() && + !io.get_if()) { handler.Crash("GetIoSize() called for an I/O statement that is not a " "formatted READ()"); } @@ -1376,7 +1382,8 @@ std::size_t IONAME(GetIoLength)(Cookie cookie) { } if (const auto *inq{io.get_if()}) { return inq->bytes(); - } else if (!io.get_if()) { + } else if (!io.get_if() && + !io.get_if()) { handler.Crash("GetIoLength() called for an I/O statement that is not " "INQUIRE(IOLENGTH=)"); } diff --git a/flang/runtime/unit.cpp b/flang/runtime/unit.cpp index e4f346ae941f3..18590567c65eb 100644 --- a/flang/runtime/unit.cpp +++ b/flang/runtime/unit.cpp @@ -11,6 +11,7 @@ #include "lock.h" #include "tools.h" #include "unit-map.h" +#include "flang/Runtime/magic-numbers.h" #include #include #include @@ -220,21 +221,24 @@ UnitMap &ExternalFileUnit::CreateUnitMap() { UnitMap &newUnitMap{*New{terminator}().release()}; bool wasExtant{false}; - ExternalFileUnit &out{*newUnitMap.LookUpOrCreate(6, terminator, wasExtant)}; + ExternalFileUnit &out{*newUnitMap.LookUpOrCreate( + FORTRAN_DEFAULT_OUTPUT_UNIT, terminator, wasExtant)}; RUNTIME_CHECK(terminator, !wasExtant); out.Predefine(1); handler.SignalError(out.SetDirection(Direction::Output)); out.isUnformatted = false; defaultOutput = &out; - ExternalFileUnit &in{*newUnitMap.LookUpOrCreate(5, terminator, wasExtant)}; + ExternalFileUnit &in{*newUnitMap.LookUpOrCreate( + FORTRAN_DEFAULT_INPUT_UNIT, terminator, wasExtant)}; RUNTIME_CHECK(terminator, !wasExtant); in.Predefine(0); handler.SignalError(in.SetDirection(Direction::Input)); in.isUnformatted = false; defaultInput = ∈ - ExternalFileUnit &error{*newUnitMap.LookUpOrCreate(0, terminator, wasExtant)}; + ExternalFileUnit &error{ + *newUnitMap.LookUpOrCreate(FORTRAN_ERROR_UNIT, terminator, wasExtant)}; RUNTIME_CHECK(terminator, !wasExtant); error.Predefine(2); handler.SignalError(error.SetDirection(Direction::Output)); diff --git a/flang/test/Lower/HLFIR/calls-f77.f90 b/flang/test/Lower/HLFIR/calls-f77.f90 index 09eebaae76060..ac5be007eb838 100644 --- a/flang/test/Lower/HLFIR/calls-f77.f90 +++ b/flang/test/Lower/HLFIR/calls-f77.f90 @@ -156,7 +156,7 @@ subroutine return_char(n) end subroutine ! CHECK-LABEL: func.func @_QPreturn_char( ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}}n -! CHECK: %[[VAL_2:.*]] = arith.constant -1 : i32 +! CHECK: %[[VAL_2:.*]] = arith.constant 6 : i32 ! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref ! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index ! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index diff --git a/flang/test/Lower/HLFIR/convert-mbox-to-value.f90 b/flang/test/Lower/HLFIR/convert-mbox-to-value.f90 index cb9dd2fa7956f..b943cd3225a56 100644 --- a/flang/test/Lower/HLFIR/convert-mbox-to-value.f90 +++ b/flang/test/Lower/HLFIR/convert-mbox-to-value.f90 @@ -8,7 +8,7 @@ end subroutine test_int_allocatable ! CHECK-LABEL: func.func @_QPtest_int_allocatable( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>> {fir.bindc_name = "a"}) { ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QFtest_int_allocatableEa"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) -! CHECK: %[[VAL_2:.*]] = arith.constant -1 : i32 +! CHECK: %[[VAL_2:.*]] = arith.constant 6 : i32 ! CHECK: %[[VAL_3:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref> ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[VAL_5:.*]] = arith.constant {{[0-9]*}} : i32 @@ -28,7 +28,7 @@ end subroutine test_int_pointer ! CHECK-LABEL: func.func @_QPtest_int_pointer( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>> {fir.bindc_name = "p"}) { ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QFtest_int_pointerEp"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) -! CHECK: %[[VAL_2:.*]] = arith.constant -1 : i32 +! CHECK: %[[VAL_2:.*]] = arith.constant 6 : i32 ! CHECK: %[[VAL_3:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref> ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[VAL_5:.*]] = arith.constant {{[0-9]*}} : i32 diff --git a/flang/test/Lower/OpenMP/FIR/parallel-lastprivate-clause-scalar.f90 b/flang/test/Lower/OpenMP/FIR/parallel-lastprivate-clause-scalar.f90 index 148a7ee31f08d..2060e2062c1a3 100644 --- a/flang/test/Lower/OpenMP/FIR/parallel-lastprivate-clause-scalar.f90 +++ b/flang/test/Lower/OpenMP/FIR/parallel-lastprivate-clause-scalar.f90 @@ -13,11 +13,11 @@ ! Check that we are accessing the clone inside the loop !CHECK-DAG: omp.wsloop for (%[[INDX_WS:.*]]) : {{.*}} { -!CHECK-DAG: %[[NEG_ONE:.*]] = arith.constant -1 : i32 +!CHECK-DAG: %[[UNIT:.*]] = arith.constant 6 : i32 !CHECK-NEXT: %[[ADDR:.*]] = fir.address_of(@_QQclX !CHECK-NEXT: %[[CVT0:.*]] = fir.convert %[[ADDR]] !CHECK-NEXT: %[[CNST:.*]] = arith.constant -!CHECK-NEXT: %[[CALL_BEGIN_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[NEG_ONE]], %[[CVT0]], %[[CNST]]) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref +!CHECK-NEXT: %[[CALL_BEGIN_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[UNIT]], %[[CVT0]], %[[CNST]]) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref !CHECK-NEXT: %[[CVT_0_1:.*]] = fir.convert %[[ARG1_PVT]] !CHECK-NEXT: %[[CVT_0_2:.*]] = fir.convert %[[FIVE]] !CHECK-NEXT: %[[CALL_OP_ASCII:.*]] = fir.call @_FortranAioOutputAscii(%[[CALL_BEGIN_IO]], %[[CVT_0_1]], %[[CVT_0_2]]) diff --git a/flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 b/flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 index e6ea5b5c4051a..28f59c95d60bb 100644 --- a/flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 +++ b/flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 @@ -15,11 +15,11 @@ ! Check that we are accessing the clone inside the loop !CHECK-DAG: omp.wsloop for (%[[INDX_WS:.*]]) : {{.*}} { -!CHECK-DAG: %[[NEG_ONE:.*]] = arith.constant -1 : i32 +!CHECK-DAG: %[[UNIT:.*]] = arith.constant 6 : i32 !CHECK-NEXT: %[[ADDR:.*]] = fir.address_of(@_QQclX !CHECK-NEXT: %[[CVT0:.*]] = fir.convert %[[ADDR]] !CHECK-NEXT: %[[CNST:.*]] = arith.constant -!CHECK-NEXT: %[[CALL_BEGIN_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[NEG_ONE]], %[[CVT0]], %[[CNST]]) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref +!CHECK-NEXT: %[[CALL_BEGIN_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[UNIT]], %[[CVT0]], %[[CNST]]) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref !CHECK-NEXT: %[[CVT_0_1:.*]] = fir.convert %[[ARG1_PVT_DECL]]#1 !CHECK-NEXT: %[[CVT_0_2:.*]] = fir.convert %[[FIVE]] !CHECK-NEXT: %[[CALL_OP_ASCII:.*]] = fir.call @_FortranAioOutputAscii(%[[CALL_BEGIN_IO]], %[[CVT_0_1]], %[[CVT_0_2]]) diff --git a/flang/test/Lower/array-character.f90 b/flang/test/Lower/array-character.f90 index ee01589f802ec..c93ef4be30823 100644 --- a/flang/test/Lower/array-character.f90 +++ b/flang/test/Lower/array-character.f90 @@ -57,7 +57,7 @@ subroutine issue(c1, c2) program p ! CHECK-DAG: %[[VAL_0:.*]] = arith.constant 4 : index ! CHECK-DAG: %[[VAL_1:.*]] = arith.constant 3 : index - ! CHECK-DAG: %[[VAL_2:.*]] = arith.constant -1 : i32 + ! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 6 : i32 ! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.array<3x!fir.char<1,4>> {bindc_name = "c1", uniq_name = "_QFEc1"} ! CHECK: %[[VAL_6:.*]] = fir.address_of(@_QFEc2) : !fir.ref>> ! CHECK: %[[VAL_7:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref) -> (!fir.ref>, index) ! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]]#0 : (!fir.ref>) -> !fir.ref>> diff --git a/flang/test/Lower/array-expression.f90 b/flang/test/Lower/array-expression.f90 index f73cd6e5f4f17..75789cd6952ab 100644 --- a/flang/test/Lower/array-expression.f90 +++ b/flang/test/Lower/array-expression.f90 @@ -1113,7 +1113,7 @@ end subroutine test19h ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref>) -> !fir.ref>> ! CHECK: %[[VAL_7:.*]] = arith.constant 2 : index ! CHECK: %[[VAL_8:.*]] = arith.constant 10 : index -! CHECK: %[[VAL_9:.*]] = arith.constant -1 : i32 +! CHECK: %[[VAL_9:.*]] = arith.constant 6 : i32 ! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref>) -> !fir.ref ! CHECK: %[[VAL_12:.*]] = arith.constant {{.*}} : i32 diff --git a/flang/test/Lower/array-temp.f90 b/flang/test/Lower/array-temp.f90 index f8c2ec3e03c54..971b3506fbe34 100644 --- a/flang/test/Lower/array-temp.f90 +++ b/flang/test/Lower/array-temp.f90 @@ -47,7 +47,7 @@ subroutine ss4(N) ! CHECK: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index ! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index ! CHECK: %[[C_27_i32:[-0-9a-z_]+]] = arith.constant 27 : i32 -! CHECK: %[[C_m1_i32:[-0-9a-z_]+]] = arith.constant -1 : i32 +! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32 ! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32 ! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32 ! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32 @@ -118,7 +118,7 @@ subroutine ss4(N) ! CHECK: cf.br ^bb9(%[[V_42]], %[[V_46:[0-9]+]] : index, index) ! CHECK: ^bb11: // pred: ^bb9 ! CHECK: fir.freemem %[[V_18:[0-9]+]] : !fir.heap> -! CHECK: %[[V_49:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_m1_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref +! CHECK: %[[V_49:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[V_50:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index) -> !fir.slice<1> ! CHECK: %[[V_51:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_50]]] : (!fir.ref>, !fir.shape<1>, !fir.slice<1>) -> !fir.box> ! CHECK: %[[V_52:[0-9]+]] = fir.convert %[[V_51:[0-9]+]] : (!fir.box>) -> !fir.box @@ -141,7 +141,7 @@ subroutine ss4(N) ! CHECK: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index ! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index ! CHECK: %[[C_34_i32:[-0-9a-z_]+]] = arith.constant 34 : i32 -! CHECK: %[[C_m1_i32:[-0-9a-z_]+]] = arith.constant -1 : i32 +! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32 ! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32 ! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32 ! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32 @@ -244,7 +244,7 @@ subroutine ss4(N) ! CHECK: cf.br ^bb15(%[[V_69]], %[[V_70:[0-9]+]] : index, index) ! CHECK: ^bb19: // pred: ^bb15 ! CHECK: fir.freemem %[[V_24:[0-9]+]] : !fir.heap> -! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_m1_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref +! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[V_74:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2> ! CHECK: %[[V_75:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_74]]] : (!fir.ref>, !fir.shape<2>, !fir.slice<2>) -> !fir.box> ! CHECK: %[[V_76:[0-9]+]] = fir.convert %[[V_75:[0-9]+]] : (!fir.box>) -> !fir.box @@ -267,7 +267,7 @@ subroutine ss4(N) ! CHECK: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index ! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index ! CHECK: %[[C_41_i32:[-0-9a-z_]+]] = arith.constant 41 : i32 -! CHECK: %[[C_m1_i32:[-0-9a-z_]+]] = arith.constant -1 : i32 +! CHECK: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32 ! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32 ! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32 ! CHECK: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32 @@ -370,7 +370,7 @@ subroutine ss4(N) ! CHECK: cf.br ^bb15(%[[V_69]], %[[V_70:[0-9]+]] : index, index) ! CHECK: ^bb19: // pred: ^bb15 ! CHECK: fir.freemem %[[V_24:[0-9]+]] : !fir.heap> -! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_m1_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref +! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref, i32) -> !fir.ref ! CHECK: %[[V_74:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2> ! CHECK: %[[V_75:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_74]]] : (!fir.ref>, !fir.shape<2>, !fir.slice<2>) -> !fir.box> ! CHECK: %[[V_76:[0-9]+]] = fir.convert %[[V_75:[0-9]+]] : (!fir.box>) -> !fir.box diff --git a/flang/test/Lower/host-associated.f90 b/flang/test/Lower/host-associated.f90 index 073493d7fe28a..25e637805e872 100644 --- a/flang/test/Lower/host-associated.f90 +++ b/flang/test/Lower/host-associated.f90 @@ -478,7 +478,7 @@ end subroutine test_proc_dummy_other ! CHECK-DAG: %[[VAL_3:.*]] = arith.constant false ! CHECK-DAG: %[[VAL_4:.*]] = arith.constant 1 : index ! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 32 : i8 -! CHECK-DAG: %[[VAL_6:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_6:.*]] = arith.constant 6 : i32 ! CHECK-DAG: %[[VAL_8:.*]] = arith.constant 10 : i64 ! CHECK-DAG: %[[VAL_9:.*]] = arith.constant 40 : index ! CHECK-DAG: %[[VAL_10:.*]] = arith.constant 0 : index diff --git a/flang/test/Lower/io-statement-2.f90 b/flang/test/Lower/io-statement-2.f90 index 108c64344f30c..dcf7387f8a22d 100644 --- a/flang/test/Lower/io-statement-2.f90 +++ b/flang/test/Lower/io-statement-2.f90 @@ -159,11 +159,11 @@ subroutine loopnest ! CHECK-LABEL: func @_QPimpliedformat subroutine impliedformat - ! CHECK: BeginExternalListInput(%c-1 + ! CHECK: BeginExternalListInput ! CHECK: InputReal32 ! CHECK: EndIoStatement(%3) {{.*}}: (!fir.ref) -> i32 read*, x - ! CHECK: BeginExternalListOutput(%c-1 + ! CHECK: BeginExternalListOutput ! CHECK: OutputReal32 ! CHECK: EndIoStatement print*, x diff --git a/flang/test/Lower/vector-subscript-io.f90 b/flang/test/Lower/vector-subscript-io.f90 index 9030bebd4ac4a..d298609269dae 100644 --- a/flang/test/Lower/vector-subscript-io.f90 +++ b/flang/test/Lower/vector-subscript-io.f90 @@ -9,7 +9,7 @@ subroutine simple(x, y) integer :: x(10) read(*,*) x(y) ! CHECK-DAG: %[[VAL_0:.*]] = arith.constant 10 : index -! CHECK-DAG: %[[VAL_1:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_1:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 4 : i32 ! CHECK-DAG: %[[VAL_4:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 0 : index @@ -51,7 +51,7 @@ integer function get_substcript() real :: x(:, :) ! Test subscripts are only evaluated once. read(*,*) x(get_substcript(), get_vector()) -! CHECK-DAG: %[[VAL_26:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_26:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_28:.*]] = arith.constant 0 : i64 ! CHECK-DAG: %[[VAL_29:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_30:.*]] = arith.constant 1 : index @@ -102,7 +102,7 @@ subroutine with_assumed_shapes(x, y) integer :: y(:) integer :: x(:) read(*,*) x(y) -! CHECK-DAG: %[[VAL_60:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_60:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_62:.*]] = arith.constant 4 : i32 ! CHECK-DAG: %[[VAL_63:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_64:.*]] = arith.constant 1 : index @@ -138,7 +138,7 @@ subroutine lower_bounds(x, y) read(*,*) x(3, y) ! CHECK-DAG: %[[VAL_84:.*]] = arith.constant 4 : index ! CHECK-DAG: %[[VAL_85:.*]] = arith.constant 6 : index -! CHECK-DAG: %[[VAL_86:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_86:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_88:.*]] = arith.constant 3 : i64 ! CHECK-DAG: %[[VAL_89:.*]] = arith.constant 2 : index ! CHECK-DAG: %[[VAL_90:.*]] = arith.constant 4 : i32 @@ -177,7 +177,7 @@ subroutine two_vectors(x, y1, y2) real :: x(4, 4) read(*,*) x(y1, y2) ! CHECK-DAG: %[[VAL_114:.*]] = arith.constant 4 : index -! CHECK-DAG: %[[VAL_115:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_115:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_117:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_118:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_119:.*]] = arith.constant 1 : index @@ -220,7 +220,7 @@ subroutine triplets_and_vector(x, y) integer :: y(3) complex :: x(4, 4) read(*,*) x(1:4:2, y) -! CHECK-DAG: %[[VAL_147:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_147:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_149:.*]] = arith.constant 4 : index ! CHECK-DAG: %[[VAL_150:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_151:.*]] = arith.constant 2 : index @@ -264,7 +264,7 @@ subroutine simple_char(x, y) character(*) :: x(3:8) read(*,*) x(y) ! CHECK-DAG: %[[VAL_178:.*]] = arith.constant 6 : index -! CHECK-DAG: %[[VAL_179:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_179:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_181:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_182:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_183:.*]] = arith.constant 1 : index @@ -301,7 +301,7 @@ subroutine substring(x, y, i, j) integer :: y(3), i, j character(*) :: x(:) read(*,*) x(y)(i:j) -! CHECK-DAG: %[[VAL_206:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_206:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_208:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_209:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_210:.*]] = arith.constant 1 : index @@ -347,7 +347,7 @@ subroutine complex_part(z, y) integer :: y(:) complex :: z(:) read(*,*) z(y)%IM -! CHECK-DAG: %[[VAL_244:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_244:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_246:.*]] = arith.constant 1 : i32 ! CHECK-DAG: %[[VAL_247:.*]] = arith.constant 0 : index ! CHECK-DAG: %[[VAL_248:.*]] = arith.constant 1 : index @@ -392,7 +392,7 @@ subroutine simple_derived(x, y) type(t) :: x(3:8) read(*,*) x(y) ! CHECK-DAG: %[[VAL_267:.*]] = arith.constant 6 : index -! CHECK-DAG: %[[VAL_268:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_268:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_270:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_271:.*]] = arith.constant 4 : index ! CHECK-DAG: %[[VAL_272:.*]] = arith.constant 0 : index @@ -430,7 +430,7 @@ subroutine with_path(b, i) integer :: i(:) read (*, *) b(5, i, 8:9:1)%a(4,5)%i ! CHECK-DAG: %[[VAL_294:.*]] = arith.constant 4 : index -! CHECK-DAG: %[[VAL_295:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_295:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_297:.*]] = arith.constant 8 : index ! CHECK-DAG: %[[VAL_298:.*]] = arith.constant 9 : index ! CHECK-DAG: %[[VAL_299:.*]] = arith.constant 4 : i64 @@ -481,7 +481,7 @@ subroutine simple_iostat(x, y, j, stat) integer :: j, y(:), stat real :: x(:) read(*, *, iostat=stat) x(y), j -! CHECK-DAG: %[[VAL_334:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_334:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_336:.*]] = arith.constant false ! CHECK-DAG: %[[VAL_337:.*]] = arith.constant true ! CHECK-DAG: %[[VAL_338:.*]] = arith.constant 1 : index @@ -527,7 +527,7 @@ subroutine iostat_in_io_loop(k, j, stat) integer :: stat read(*, *, iostat=stat) (k(i, j), i=1,3,1) ! CHECK-DAG: %[[VAL_365:.*]] = arith.constant 5 : index -! CHECK-DAG: %[[VAL_366:.*]] = arith.constant -1 : i32 +! CHECK-DAG: %[[VAL_366:.*]] = arith.constant 5 : i32 ! CHECK-DAG: %[[VAL_368:.*]] = arith.constant 3 : index ! CHECK-DAG: %[[VAL_369:.*]] = arith.constant true ! CHECK-DAG: %[[VAL_370:.*]] = arith.constant false