From 4546397e39589f0a6a707218349d1bf65fe54645 Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Mon, 17 Oct 2022 09:57:16 +0200 Subject: [PATCH] [flang] Introduce option to lower expression to HLFIR Preliminary work on HLFIR. Introduce option that will allow testing lowering via HLFIR until this is ready to replace the current expression lowering. See https://reviews.llvm.org/D134285 for more context about the plan. Differential Revision: https://reviews.llvm.org/D135959 --- flang/include/flang/Lower/AbstractConverter.h | 4 ++-- flang/include/flang/Lower/LoweringOptions.h | 14 +++++++++++++- flang/lib/Lower/Bridge.cpp | 25 +++++++++++++++++-------- flang/test/Lower/HLFIR/expr-addr.f90 | 8 ++++++++ flang/test/Lower/HLFIR/expr-box.f90 | 8 ++++++++ flang/test/Lower/HLFIR/expr-value.f90 | 7 +++++++ flang/tools/bbc/bbc.cpp | 5 +++++ 7 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 flang/test/Lower/HLFIR/expr-addr.f90 create mode 100644 flang/test/Lower/HLFIR/expr-box.f90 create mode 100644 flang/test/Lower/HLFIR/expr-value.f90 diff --git a/flang/include/flang/Lower/AbstractConverter.h b/flang/include/flang/Lower/AbstractConverter.h index 6ab649c..a84e34f 100644 --- a/flang/include/flang/Lower/AbstractConverter.h +++ b/flang/include/flang/Lower/AbstractConverter.h @@ -128,7 +128,7 @@ public: /// expression value. The clean-up for this temporary is added to \p context. virtual fir::ExtendedValue genExprAddr(const SomeExpr &expr, StatementContext &context, - mlir::Location *loc = nullptr) = 0; + mlir::Location *locPtr = nullptr) = 0; /// Generate the address of the location holding the expression, \p expr. fir::ExtendedValue genExprAddr(mlir::Location loc, const SomeExpr *expr, @@ -143,7 +143,7 @@ public: /// Generate the computations of the expression to produce a value. virtual fir::ExtendedValue genExprValue(const SomeExpr &expr, StatementContext &context, - mlir::Location *loc = nullptr) = 0; + mlir::Location *locPtr = nullptr) = 0; /// Generate the computations of the expression, \p expr, to produce a value. fir::ExtendedValue genExprValue(mlir::Location loc, const SomeExpr *expr, diff --git a/flang/include/flang/Lower/LoweringOptions.h b/flang/include/flang/Lower/LoweringOptions.h index 5873656..d882ff0 100644 --- a/flang/include/flang/Lower/LoweringOptions.h +++ b/flang/include/flang/Lower/LoweringOptions.h @@ -24,8 +24,14 @@ class LoweringOptions { /// If true, enable polymorphic type lowering feature. Off by default. unsigned polymorphicTypeImpl : 1; + /// If true, lower to High level FIR before lowering to FIR. + /// Off by default until fully ready. + unsigned lowerToHighLevelFIR : 1; + public: - LoweringOptions() : optimizeTranspose(true), polymorphicTypeImpl(false) {} + LoweringOptions() + : optimizeTranspose(true), polymorphicTypeImpl(false), + lowerToHighLevelFIR(false) {} bool getOptimizeTranspose() const { return optimizeTranspose; } LoweringOptions &setOptimizeTranspose(bool v) { @@ -38,6 +44,12 @@ public: polymorphicTypeImpl = v; return *this; } + + bool getLowerToHighLevelFIR() const { return lowerToHighLevelFIR; } + LoweringOptions &setLowerToHighLevelFIR(bool v) { + lowerToHighLevelFIR = v; + return *this; + } }; } // namespace Fortran::lower diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index b40dfd4..ac29207 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -416,23 +416,32 @@ public: return iter->second; } - fir::ExtendedValue genExprAddr(const Fortran::lower::SomeExpr &expr, - Fortran::lower::StatementContext &context, - mlir::Location *loc = nullptr) override final { - return Fortran::lower::createSomeExtendedAddress( - loc ? *loc : toLocation(), *this, expr, localSymbols, context); + fir::ExtendedValue + genExprAddr(const Fortran::lower::SomeExpr &expr, + Fortran::lower::StatementContext &context, + mlir::Location *locPtr = nullptr) override final { + mlir::Location loc = locPtr ? *locPtr : toLocation(); + if (bridge.getLoweringOptions().getLowerToHighLevelFIR()) + TODO(loc, "lower expr to HLFIR address"); + return Fortran::lower::createSomeExtendedAddress(loc, *this, expr, + localSymbols, context); } fir::ExtendedValue genExprValue(const Fortran::lower::SomeExpr &expr, Fortran::lower::StatementContext &context, - mlir::Location *loc = nullptr) override final { - return Fortran::lower::createSomeExtendedExpression( - loc ? *loc : toLocation(), *this, expr, localSymbols, context); + mlir::Location *locPtr = nullptr) override final { + mlir::Location loc = locPtr ? *locPtr : toLocation(); + if (bridge.getLoweringOptions().getLowerToHighLevelFIR()) + TODO(loc, "lower expr to HLFIR value"); + return Fortran::lower::createSomeExtendedExpression(loc, *this, expr, + localSymbols, context); } fir::ExtendedValue genExprBox(mlir::Location loc, const Fortran::lower::SomeExpr &expr, Fortran::lower::StatementContext &stmtCtx) override final { + if (bridge.getLoweringOptions().getLowerToHighLevelFIR()) + TODO(loc, "lower expr to HLFIR box"); return Fortran::lower::createBoxValue(loc, *this, expr, localSymbols, stmtCtx); } diff --git a/flang/test/Lower/HLFIR/expr-addr.f90 b/flang/test/Lower/HLFIR/expr-addr.f90 new file mode 100644 index 0000000..1af59e6c --- /dev/null +++ b/flang/test/Lower/HLFIR/expr-addr.f90 @@ -0,0 +1,8 @@ +! Test lowering of of expressions as address +! RUN: %not_todo_cmd bbc -emit-fir -hlfir -o - %s 2>&1 | FileCheck %s + +subroutine foo(x) + integer :: x + ! CHECK: not yet implemented: lower expr to HLFIR address + read (*,*) x +end subroutine diff --git a/flang/test/Lower/HLFIR/expr-box.f90 b/flang/test/Lower/HLFIR/expr-box.f90 new file mode 100644 index 0000000..d011d79 --- /dev/null +++ b/flang/test/Lower/HLFIR/expr-box.f90 @@ -0,0 +1,8 @@ +! Test lowering of of expressions as fir.box +! RUN: %not_todo_cmd bbc -emit-fir -hlfir -o - %s 2>&1 | FileCheck %s + +subroutine foo(x) + integer :: x(:) + ! CHECK: not yet implemented: lower expr to HLFIR box + print *, x +end subroutine diff --git a/flang/test/Lower/HLFIR/expr-value.f90 b/flang/test/Lower/HLFIR/expr-value.f90 new file mode 100644 index 0000000..0a993bc --- /dev/null +++ b/flang/test/Lower/HLFIR/expr-value.f90 @@ -0,0 +1,7 @@ +! Test lowering of of expressions as values +! RUN: %not_todo_cmd bbc -emit-fir -hlfir -o - %s 2>&1 | FileCheck %s + +subroutine foo() + ! CHECK: not yet implemented: lower expr to HLFIR value + print *, 42 +end subroutine diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp index bd40c9a..796e7fa 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -131,6 +131,10 @@ static llvm::cl::opt enablePolymorphic( llvm::cl::desc("enable polymorphic type lowering (experimental)"), llvm::cl::init(false)); +static llvm::cl::opt useHLFIR("hlfir", + llvm::cl::desc("Lower to high level FIR"), + llvm::cl::init(false)); + #define FLANG_EXCLUDE_CODEGEN #include "flang/Tools/CLOptions.inc" @@ -227,6 +231,7 @@ static mlir::LogicalResult convertFortranSourceToMLIR( // Use default lowering options for bbc. Fortran::lower::LoweringOptions loweringOptions{}; loweringOptions.setPolymorphicTypeImpl(enablePolymorphic); + loweringOptions.setLowerToHighLevelFIR(useHLFIR); auto burnside = Fortran::lower::LoweringBridge::create( ctx, semanticsContext, defKinds, semanticsContext.intrinsics(), semanticsContext.targetCharacteristics(), parsing.allCooked(), "", -- 2.7.4