diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -175,6 +175,8 @@ setCurrentPosition(Fortran::lower::pft::stmtSourceLoc(funit.endStmt)); if (funit.isMainProgram()) genExitRoutine(); + else + genFIRProcedureExit(funit, funit.getSubprogramSymbol()); funit.finalBlock = nullptr; LLVM_DEBUG(llvm::dbgs() << "*** Lowering result:\n\n" << *builder->getFunction() << '\n'); @@ -240,6 +242,22 @@ } void genFIR(const Fortran::parser::EndProgramStmt &) { genExitRoutine(); } + void genFIRProcedureExit(Fortran::lower::pft::FunctionLikeUnit &funit, + const Fortran::semantics::Symbol &symbol) { + if (mlir::Block *finalBlock = funit.finalBlock) { + // The current block must end with a terminator. + if (blockIsUnterminated()) + builder->create(toLocation(), finalBlock); + // Set insertion point to final block. + builder->setInsertionPoint(finalBlock, finalBlock->end()); + } + if (Fortran::semantics::IsFunction(symbol)) { + TODO(toLocation(), "Function lowering"); + } else { + genExitRoutine(); + } + } + void genFIR(const Fortran::parser::CallStmt &stmt) { TODO(toLocation(), "CallStmt lowering"); } @@ -606,9 +624,8 @@ TODO(toLocation(), "EndSelectStmt lowering"); } - void genFIR(const Fortran::parser::EndSubroutineStmt &) { - TODO(toLocation(), "EndSubroutineStmt lowering"); - } + // Nop statements - No code, or code is generated at the construct level. + void genFIR(const Fortran::parser::EndSubroutineStmt &) {} // nop void genFIR(const Fortran::parser::EntryStmt &) { TODO(toLocation(), "EntryStmt lowering"); diff --git a/flang/test/Lower/basic-subroutine.f90 b/flang/test/Lower/basic-subroutine.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/basic-subroutine.f90 @@ -0,0 +1,13 @@ +! RUN: bbc %s --pft-test | FileCheck %s +! RUN: bbc %s -o "-" -emit-fir | FileCheck %s --check-prefix=FIR + +subroutine sub1() +end subroutine + +! CHECK: 1 Subroutine sub1: subroutine sub1() +! CHECK: 1 EndSubroutineStmt: end subroutine +! CHECK: End Subroutine sub1 + +! FIR-LABEL: func @_QPsub1() { +! FIR: return +! FIR: }