Anything that produces a hlfir.expr should have an allocation side effect so that it is not removed by CSE (which would result in two hlfir.destroy operations for the same expression). Similarly for hlfir.associate, which has hlfir.end_associate. Also adds read effects on arguments which are pointer-like or boxes. I see no regressions from this change when running llvm-testsuite with optimization enabled, or from SPEC2017 rate benchmarks. To test this, I have added MLIR's pass for testing side effect interfaces to fir-opt. Differential Revision: https://reviews.llvm.org/D158662
46 lines
1.5 KiB
C++
46 lines
1.5 KiB
C++
//===- fir-opt.cpp - FIR Optimizer Driver -----------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This is to be like LLVM's opt program, only for FIR. Such a program is
|
|
// required for roundtrip testing, etc.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Tools/mlir-opt/MlirOptMain.h"
|
|
#include "flang/Optimizer/CodeGen/CodeGen.h"
|
|
#include "flang/Optimizer/HLFIR/Passes.h"
|
|
#include "flang/Optimizer/Support/InitFIR.h"
|
|
#include "flang/Optimizer/Transforms/Passes.h"
|
|
|
|
using namespace mlir;
|
|
namespace fir {
|
|
namespace test {
|
|
void registerTestFIRAliasAnalysisPass();
|
|
} // namespace test
|
|
} // namespace fir
|
|
|
|
// Defined in mlir/test, no pulic header.
|
|
namespace mlir {
|
|
void registerSideEffectTestPasses();
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
fir::support::registerMLIRPassesForFortranTools();
|
|
fir::registerOptCodeGenPasses();
|
|
fir::registerOptTransformPasses();
|
|
hlfir::registerHLFIRPasses();
|
|
#ifdef FLANG_INCLUDE_TESTS
|
|
fir::test::registerTestFIRAliasAnalysisPass();
|
|
mlir::registerSideEffectTestPasses();
|
|
#endif
|
|
DialectRegistry registry;
|
|
fir::support::registerDialects(registry);
|
|
return failed(MlirOptMain(argc, argv, "FIR modular optimizer driver\n",
|
|
registry));
|
|
}
|