From db01b123d012df2f0e6acf7e90bf4ba63382587c Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Wed, 2 Feb 2022 08:15:26 +0100 Subject: [PATCH] [flang] Lower PAUSE statement Lower the PAUSE statement to a runtime call. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: kiranchandramohan, schweitz Differential Revision: https://reviews.llvm.org/D118699 Co-authored-by: Eric Schweitz Co-authored-by: Jean Perier --- flang/lib/Lower/Bridge.cpp | 2 +- flang/lib/Lower/Runtime.cpp | 10 ++++++++++ flang/test/Lower/pause-statement.f90 | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 flang/test/Lower/pause-statement.f90 diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index fd52a76cf2f6..7302f6c8ce66 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -547,7 +547,7 @@ private: } void genFIR(const Fortran::parser::PauseStmt &stmt) { - TODO(toLocation(), "PauseStmt lowering"); + genPauseStatement(*this, stmt); } void genFIR(const Fortran::parser::FailImageStmt &stmt) { diff --git a/flang/lib/Lower/Runtime.cpp b/flang/lib/Lower/Runtime.cpp index 7156a8851f1d..a49b0911d1a1 100644 --- a/flang/lib/Lower/Runtime.cpp +++ b/flang/lib/Lower/Runtime.cpp @@ -68,3 +68,13 @@ void Fortran::lower::genStopStatement( builder.create(loc, callee, operands); genUnreachable(builder, loc); } + +void Fortran::lower::genPauseStatement( + Fortran::lower::AbstractConverter &converter, + const Fortran::parser::PauseStmt &) { + fir::FirOpBuilder &builder = converter.getFirOpBuilder(); + mlir::Location loc = converter.getCurrentLocation(); + mlir::FuncOp callee = + fir::runtime::getRuntimeFunc(loc, builder); + builder.create(loc, callee, llvm::None); +} diff --git a/flang/test/Lower/pause-statement.f90 b/flang/test/Lower/pause-statement.f90 new file mode 100644 index 000000000000..e4cba98dc8a7 --- /dev/null +++ b/flang/test/Lower/pause-statement.f90 @@ -0,0 +1,8 @@ +! RUN: bbc %s -emit-fir --canonicalize -o - | FileCheck %s + +! CHECK-LABEL pause_test +subroutine pause_test() + ! CHECK: fir.call @_Fortran{{.*}}PauseStatement() + ! CHECK-NEXT: return + pause +end subroutine