[clang] acf6a32 - [flang] add -flang-experimental-hlfir flag to flang-new
Tom Eccles via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 22 06:38:50 PDT 2023
Author: Tom Eccles
Date: 2023-03-22T13:36:54Z
New Revision: acf6a3224955779724a35a383d63c48af2163171
URL: https://github.com/llvm/llvm-project/commit/acf6a3224955779724a35a383d63c48af2163171
DIFF: https://github.com/llvm/llvm-project/commit/acf6a3224955779724a35a383d63c48af2163171.diff
LOG: [flang] add -flang-experimental-hlfir flag to flang-new
This flag instructs flang-new to use the new HLFIR lowering. It is
marked as experimental and not included in --help.
This was added to make it more convenient to test the performance of
code generated by the HLFIR lowering.
Extra diffs are from running clang-format on CLOptions.inc (which was
being forced by CI).
Differential Revision: https://reviews.llvm.org/D146278
Added:
flang/test/HLFIR/flang-experimental-hlfir-flag.f90
Modified:
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Flang.cpp
flang/include/flang/Tools/CLOptions.inc
flang/lib/Frontend/CompilerInvocation.cpp
flang/test/Driver/driver-help-hidden.f90
flang/test/Driver/mlir-pass-pipeline.f90
flang/test/Fir/basic-program.fir
Removed:
################################################################################
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index a05e61ac0e92f..b50dfd6f35510 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -5080,6 +5080,10 @@ def flang_experimental_exec : Flag<["-"], "flang-experimental-exec">,
Flags<[FlangOption, FlangOnlyOption, NoXarchOption, HelpHidden]>,
HelpText<"Enable support for generating executables (experimental)">;
+def flang_experimental_hlfir : Flag<["-"], "flang-experimental-hlfir">,
+ Flags<[FlangOption, FC1Option, FlangOnlyOption, NoXarchOption, HelpHidden]>,
+ HelpText<"Use HLFIR lowering (experimental)">;
+
//===----------------------------------------------------------------------===//
// FLangOption + CoreOption + NoXarchOption
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 0a4a0de99b89f..23083ff3795b5 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -65,6 +65,9 @@ void Flang::addOtherOptions(const ArgList &Args, ArgStringList &CmdArgs) const {
if (stackArrays &&
!stackArrays->getOption().matches(options::OPT_fno_stack_arrays))
CmdArgs.push_back("-fstack-arrays");
+
+ if (Args.hasArg(options::OPT_flang_experimental_hlfir))
+ CmdArgs.push_back("-flang-experimental-hlfir");
}
void Flang::addPicOptions(const ArgList &Args, ArgStringList &CmdArgs) const {
diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc
index 9324686138717..30581624d0dc5 100644
--- a/flang/include/flang/Tools/CLOptions.inc
+++ b/flang/include/flang/Tools/CLOptions.inc
@@ -14,6 +14,7 @@
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Transforms/Passes.h"
#include "flang/Optimizer/CodeGen/CodeGen.h"
+#include "flang/Optimizer/HLFIR/Passes.h"
#include "flang/Optimizer/Transforms/Passes.h"
#include "llvm/Passes/OptimizationLevel.h"
#include "llvm/Support/CommandLine.h"
@@ -72,7 +73,8 @@ DisableOption(BoxedProcedureRewrite, "boxed-procedure-rewrite",
"rewrite boxed procedures");
#endif
-DisableOption(ExternalNameConversion, "external-name-interop", "convert names with external convention");
+DisableOption(ExternalNameConversion, "external-name-interop",
+ "convert names with external convention");
/// Generic for adding a pass to the pass manager if it is not disabled.
template <typename F>
@@ -211,6 +213,20 @@ inline void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
pm.addPass(mlir::createCSEPass());
}
+/// Create a pass pipeline for lowering from HLFIR to FIR
+///
+/// \param pm - MLIR pass manager that will hold the pipeline definition
+/// \param optLevel - optimization level used for creating FIR optimization
+/// passes pipeline
+inline void createHLFIRToFIRPassPipeline(
+ mlir::PassManager &pm, llvm::OptimizationLevel optLevel = defaultOptLevel) {
+ if (optLevel.isOptimizingForSpeed())
+ pm.addPass(mlir::createCanonicalizerPass());
+ pm.addPass(hlfir::createLowerHLFIRIntrinsicsPass());
+ pm.addPass(hlfir::createBufferizeHLFIRPass());
+ pm.addPass(hlfir::createConvertHLFIRtoFIRPass());
+}
+
#if !defined(FLANG_EXCLUDE_CODEGEN)
inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
llvm::OptimizationLevel optLevel = defaultOptLevel,
@@ -218,8 +234,7 @@ inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
fir::addBoxedProcedurePass(pm);
pm.addNestedPass<mlir::func::FuncOp>(
fir::createAbstractResultOnFuncOptPass());
- pm.addNestedPass<fir::GlobalOp>(
- fir::createAbstractResultOnGlobalOptPass());
+ pm.addNestedPass<fir::GlobalOp>(fir::createAbstractResultOnGlobalOptPass());
fir::addCodeGenRewritePass(pm);
fir::addTargetRewritePass(pm);
fir::addExternalNameConversionPass(pm, underscoring);
@@ -234,6 +249,8 @@ inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
inline void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
llvm::OptimizationLevel optLevel = defaultOptLevel,
bool stackArrays = false, bool underscoring = true) {
+ fir::createHLFIRToFIRPassPipeline(pm, optLevel);
+
// Add default optimizer pass pipeline.
fir::createDefaultFIROptimizerPassPipeline(pm, optLevel, stackArrays);
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 6e963e2528101..a4183a52115b6 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -818,6 +818,11 @@ bool CompilerInvocation::createFromArgs(
success = false;
}
+ // -flang-experimental-hlfir
+ if (args.hasArg(clang::driver::options::OPT_flang_experimental_hlfir)) {
+ res.loweringOpts.setLowerToHighLevelFIR(true);
+ }
+
success &= parseFrontendArgs(res.getFrontendOpts(), args, diags);
parseTargetArgs(res.getTargetOpts(), args);
parsePreprocessorArgs(res.getPreprocessorOpts(), args);
diff --git a/flang/test/Driver/driver-help-hidden.f90 b/flang/test/Driver/driver-help-hidden.f90
index bcb77c9f8bccb..535bb82b023c6 100644
--- a/flang/test/Driver/driver-help-hidden.f90
+++ b/flang/test/Driver/driver-help-hidden.f90
@@ -41,6 +41,8 @@
! CHECK-NEXT: Specify where to find the compiled intrinsic modules
! CHECK-NEXT: -flang-experimental-exec
! CHECK-NEXT: Enable support for generating executables (experimental)
+! CHECK-NEXT: -flang-experimental-hlfir
+! CHECK-NEXT: Use HLFIR lowering (experimental)
! CHECK-NEXT: -flarge-sizes Use INTEGER(KIND=8) for the result type in size-related intrinsics
! CHECK-NEXT: -flogical-abbreviations Enable logical abbreviations
! CHECK-NEXT: -flto=<value> Set LTO mode
diff --git a/flang/test/Driver/mlir-pass-pipeline.f90 b/flang/test/Driver/mlir-pass-pipeline.f90
index f569ddac8a397..3e8df1615adaa 100644
--- a/flang/test/Driver/mlir-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-pass-pipeline.f90
@@ -12,6 +12,10 @@
! ALL: Pass statistics report
! ALL: Fortran::lower::VerifierPass
+! O2-NEXT: Canonicalizer
+! ALL-NEXT: LowerHLFIRIntrinsics
+! ALL-NEXT: BufferizeHLFIR
+! ALL-NEXT: ConvertHLFIRtoFIR
! ALL-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
diff --git a/flang/test/Fir/basic-program.fir b/flang/test/Fir/basic-program.fir
index 78c1ab080db11..e096fb62591e5 100644
--- a/flang/test/Fir/basic-program.fir
+++ b/flang/test/Fir/basic-program.fir
@@ -16,7 +16,11 @@ func.func @_QQmain() {
// PASSES: Pass statistics report
-// PASSES: CSE
+// PASSES: Canonicalizer
+// PASSES-NEXT: LowerHLFIRIntrinsics
+// PASSES-NEXT: BufferizeHLFIR
+// PASSES-NEXT: ConvertHLFIRtoFIR
+// PASSES-NEXT: CSE
// PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
diff --git a/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 b/flang/test/HLFIR/flang-experimental-hlfir-flag.f90
new file mode 100644
index 0000000000000..a375d2726104e
--- /dev/null
+++ b/flang/test/HLFIR/flang-experimental-hlfir-flag.f90
@@ -0,0 +1,20 @@
+! Test -flang-experimental-hlfir flag
+! RUN: %flang_fc1 -flang-experimental-hlfir -emit-fir -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-fir -o - %s | FileCheck %s --check-prefix NO-HLFIR
+
+subroutine test(a, res)
+ real :: a(:), res
+ res = SUM(a)
+end subroutine
+! CHECK-LABEL: func.func @_QPtest
+! CHECK: %[[A:.*]]: !fir.box<!fir.array<?xf32>>
+! CHECK: %[[RES:.*]]: !fir.ref<f32>
+! CHECK-DAG: %[[A_VAR:.*]]:2 = hlfir.declare %[[A]]
+! CHECK-DAG: %[[RES_VAR:.*]]:2 = hlfir.declare %[[RES]]
+! CHECK-NEXT: %[[SUM_RES:.*]] = hlfir.sum %[[A_VAR]]#0
+! CHECK-NEXT: hlfir.assign %[[SUM_RES]] to %[[RES_VAR]]#0
+! CHECK-NEXT: hlfir.destroy %[[SUM_RES]]
+! CHECK-NEXT: return
+! CHECK-NEXT: }
+
+! NO-HLFIR-NOT: hlfir.
More information about the cfe-commits
mailing list