2018-06-22 00:49:33 +08:00
|
|
|
//===- mlir-opt.cpp - MLIR Optimizer Driver -------------------------------===//
|
|
|
|
//
|
2020-01-26 11:58:30 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
2019-12-24 01:35:36 +08:00
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2018-06-22 00:49:33 +08:00
|
|
|
//
|
2019-12-24 01:35:36 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2018-06-22 00:49:33 +08:00
|
|
|
//
|
2019-06-24 23:41:52 +08:00
|
|
|
// Main entry function for mlir-opt for when built as standalone binary.
|
2018-06-22 00:49:33 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2020-04-12 14:11:51 +08:00
|
|
|
#include "mlir/IR/AsmState.h"
|
2020-02-19 06:56:45 +08:00
|
|
|
#include "mlir/IR/Dialect.h"
|
|
|
|
#include "mlir/IR/MLIRContext.h"
|
2020-04-12 14:11:51 +08:00
|
|
|
#include "mlir/InitAllDialects.h"
|
|
|
|
#include "mlir/InitAllPasses.h"
|
2019-02-28 06:45:36 +08:00
|
|
|
#include "mlir/Pass/Pass.h"
|
2019-02-28 02:59:29 +08:00
|
|
|
#include "mlir/Pass/PassManager.h"
|
2019-01-11 23:22:57 +08:00
|
|
|
#include "mlir/Support/FileUtilities.h"
|
2019-06-24 23:41:52 +08:00
|
|
|
#include "mlir/Support/MlirOptMain.h"
|
2018-06-22 00:49:33 +08:00
|
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
#include "llvm/Support/InitLLVM.h"
|
2018-07-08 10:12:22 +08:00
|
|
|
#include "llvm/Support/SourceMgr.h"
|
2018-06-22 06:22:42 +08:00
|
|
|
#include "llvm/Support/ToolOutputFile.h"
|
2018-08-31 08:35:15 +08:00
|
|
|
|
2018-06-22 06:22:42 +08:00
|
|
|
using namespace llvm;
|
2019-06-24 23:41:52 +08:00
|
|
|
using namespace mlir;
|
2018-06-22 06:22:42 +08:00
|
|
|
|
2020-02-12 17:03:40 +08:00
|
|
|
namespace mlir {
|
|
|
|
// Defined in the test directory, no public header.
|
|
|
|
void registerConvertToTargetEnvPass();
|
|
|
|
void registerInliner();
|
|
|
|
void registerMemRefBoundCheck();
|
|
|
|
void registerPassManagerTestPass();
|
|
|
|
void registerPatternsTestPass();
|
2020-02-25 02:35:33 +08:00
|
|
|
void registerPrintOpAvailabilityPass();
|
[mlir][SideEffects] Define a set of interfaces and traits for defining side effects
This revision introduces the infrastructure for defining side-effects and attaching them to operations. This infrastructure allows for defining different types of side effects, that don't interact with each other, but use the same internal mechanisms. At the base of this is an interface that allows operations to specify the different effect instances that are exhibited by a specific operation instance. An effect instance is comprised of the following:
* Effect: The specific effect being applied.
For memory related effects this may be reading from memory, storing to memory, etc.
* Value: A specific value, either operand/result/region argument, the effect pertains to.
* Resource: This is a global entity that represents the domain within which the effect is being applied.
MLIR serves many different abstractions, which cover many different domains. Simple effects are may have very different context, for example writing to an in-memory buffer vs a database. This revision defines uses this infrastructure to define a set of initial MemoryEffects. The are effects that generally correspond to memory of some kind; Allocate, Free, Read, Write.
This set of memory effects will be used in follow revisions to generalize various parts of the compiler, and make others more powerful(e.g. DCE).
This infrastructure was originally proposed here:
https://groups.google.com/a/tensorflow.org/g/mlir/c/v2mNl4vFCUM
Differential Revision: https://reviews.llvm.org/D74439
2020-03-07 05:53:16 +08:00
|
|
|
void registerSideEffectTestPasses();
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerSimpleParametricTilingPass();
|
|
|
|
void registerSymbolTestPasses();
|
2020-02-15 05:41:01 +08:00
|
|
|
void registerTestAffineDataCopyPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerTestAllReduceLoweringPass();
|
2020-04-10 19:42:49 +08:00
|
|
|
void registerTestAffineLoopUnswitchingPass();
|
2020-04-09 02:53:37 +08:00
|
|
|
void registerTestLinalgMatmulToVectorPass();
|
2020-03-29 02:49:09 +08:00
|
|
|
void registerTestLoopPermutationPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerTestCallGraphPass();
|
|
|
|
void registerTestConstantFold();
|
2020-03-22 18:13:40 +08:00
|
|
|
void registerTestConvertGPUKernelToCubinPass();
|
2020-03-03 17:33:16 +08:00
|
|
|
void registerTestDominancePass();
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerTestFunc();
|
|
|
|
void registerTestGpuMemoryPromotionPass();
|
|
|
|
void registerTestLinalgTransforms();
|
|
|
|
void registerTestLivenessPass();
|
|
|
|
void registerTestLoopFusion();
|
|
|
|
void registerTestLoopMappingPass();
|
|
|
|
void registerTestMatchers();
|
|
|
|
void registerTestMemRefDependenceCheck();
|
|
|
|
void registerTestMemRefStrideCalculation();
|
|
|
|
void registerTestOpaqueLoc();
|
|
|
|
void registerTestParallelismDetection();
|
2020-02-21 23:18:22 +08:00
|
|
|
void registerTestGpuParallelLoopMappingPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerTestVectorConversions();
|
|
|
|
void registerTestVectorToLoopsPass();
|
|
|
|
void registerVectorizerTestPass();
|
|
|
|
} // namespace mlir
|
|
|
|
|
2018-06-22 06:22:42 +08:00
|
|
|
static cl::opt<std::string>
|
2019-06-24 23:41:52 +08:00
|
|
|
inputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
|
2018-06-22 06:22:42 +08:00
|
|
|
|
2019-06-24 23:41:52 +08:00
|
|
|
static cl::opt<std::string> outputFilename("o", cl::desc("Output filename"),
|
|
|
|
cl::value_desc("filename"),
|
|
|
|
cl::init("-"));
|
2018-06-22 06:22:42 +08:00
|
|
|
|
2018-06-25 00:10:36 +08:00
|
|
|
static cl::opt<bool>
|
2018-09-03 13:01:45 +08:00
|
|
|
splitInputFile("split-input-file",
|
|
|
|
cl::desc("Split the input file into pieces and process each "
|
|
|
|
"chunk independently"),
|
|
|
|
cl::init(false));
|
|
|
|
|
|
|
|
static cl::opt<bool>
|
2019-06-20 02:21:41 +08:00
|
|
|
verifyDiagnostics("verify-diagnostics",
|
2018-09-03 13:01:45 +08:00
|
|
|
cl::desc("Check that emitted diagnostics match "
|
|
|
|
"expected-* lines on the corresponding line"),
|
|
|
|
cl::init(false));
|
2018-06-22 06:22:42 +08:00
|
|
|
|
2019-03-05 04:33:13 +08:00
|
|
|
static cl::opt<bool>
|
|
|
|
verifyPasses("verify-each",
|
|
|
|
cl::desc("Run the verifier after each transformation pass"),
|
|
|
|
cl::init(true));
|
|
|
|
|
2020-03-30 06:35:38 +08:00
|
|
|
static cl::opt<bool> allowUnregisteredDialects(
|
|
|
|
"allow-unregistered-dialect",
|
|
|
|
cl::desc("Allow operation with no registered dialects"), cl::init(false));
|
|
|
|
|
2020-02-12 17:03:40 +08:00
|
|
|
void registerTestPasses() {
|
|
|
|
registerConvertToTargetEnvPass();
|
|
|
|
registerInliner();
|
|
|
|
registerMemRefBoundCheck();
|
|
|
|
registerPassManagerTestPass();
|
|
|
|
registerPatternsTestPass();
|
2020-02-25 02:35:33 +08:00
|
|
|
registerPrintOpAvailabilityPass();
|
[mlir][SideEffects] Define a set of interfaces and traits for defining side effects
This revision introduces the infrastructure for defining side-effects and attaching them to operations. This infrastructure allows for defining different types of side effects, that don't interact with each other, but use the same internal mechanisms. At the base of this is an interface that allows operations to specify the different effect instances that are exhibited by a specific operation instance. An effect instance is comprised of the following:
* Effect: The specific effect being applied.
For memory related effects this may be reading from memory, storing to memory, etc.
* Value: A specific value, either operand/result/region argument, the effect pertains to.
* Resource: This is a global entity that represents the domain within which the effect is being applied.
MLIR serves many different abstractions, which cover many different domains. Simple effects are may have very different context, for example writing to an in-memory buffer vs a database. This revision defines uses this infrastructure to define a set of initial MemoryEffects. The are effects that generally correspond to memory of some kind; Allocate, Free, Read, Write.
This set of memory effects will be used in follow revisions to generalize various parts of the compiler, and make others more powerful(e.g. DCE).
This infrastructure was originally proposed here:
https://groups.google.com/a/tensorflow.org/g/mlir/c/v2mNl4vFCUM
Differential Revision: https://reviews.llvm.org/D74439
2020-03-07 05:53:16 +08:00
|
|
|
registerSideEffectTestPasses();
|
2020-02-12 17:03:40 +08:00
|
|
|
registerSimpleParametricTilingPass();
|
|
|
|
registerSymbolTestPasses();
|
2020-02-15 05:41:01 +08:00
|
|
|
registerTestAffineDataCopyPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
registerTestAllReduceLoweringPass();
|
2020-04-10 19:42:49 +08:00
|
|
|
registerTestAffineLoopUnswitchingPass();
|
2020-04-09 02:53:37 +08:00
|
|
|
registerTestLinalgMatmulToVectorPass();
|
2020-03-29 02:49:09 +08:00
|
|
|
registerTestLoopPermutationPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
registerTestCallGraphPass();
|
|
|
|
registerTestConstantFold();
|
2020-03-22 18:13:40 +08:00
|
|
|
#if MLIR_CUDA_CONVERSIONS_ENABLED
|
|
|
|
registerTestConvertGPUKernelToCubinPass();
|
|
|
|
#endif
|
2020-03-03 17:33:16 +08:00
|
|
|
registerTestDominancePass();
|
2020-02-12 17:03:40 +08:00
|
|
|
registerTestFunc();
|
|
|
|
registerTestGpuMemoryPromotionPass();
|
|
|
|
registerTestLinalgTransforms();
|
|
|
|
registerTestLivenessPass();
|
|
|
|
registerTestLoopFusion();
|
|
|
|
registerTestLoopMappingPass();
|
|
|
|
registerTestMatchers();
|
|
|
|
registerTestMemRefDependenceCheck();
|
|
|
|
registerTestMemRefStrideCalculation();
|
|
|
|
registerTestOpaqueLoc();
|
|
|
|
registerTestParallelismDetection();
|
2020-02-21 23:18:22 +08:00
|
|
|
registerTestGpuParallelLoopMappingPass();
|
2020-02-12 17:03:40 +08:00
|
|
|
registerTestVectorConversions();
|
|
|
|
registerTestVectorToLoopsPass();
|
|
|
|
registerVectorizerTestPass();
|
|
|
|
}
|
|
|
|
|
2020-02-19 06:56:45 +08:00
|
|
|
static cl::opt<bool>
|
|
|
|
showDialects("show-dialects",
|
|
|
|
cl::desc("Print the list of registered dialects"),
|
|
|
|
cl::init(false));
|
|
|
|
|
2018-06-25 00:10:36 +08:00
|
|
|
int main(int argc, char **argv) {
|
2020-02-12 17:03:40 +08:00
|
|
|
registerAllDialects();
|
|
|
|
registerAllPasses();
|
|
|
|
registerTestPasses();
|
2018-08-06 12:12:29 +08:00
|
|
|
InitLLVM y(argc, argv);
|
2018-06-23 13:03:48 +08:00
|
|
|
|
2020-04-12 14:11:51 +08:00
|
|
|
// Register any command line options.
|
|
|
|
registerAsmPrinterCLOptions();
|
|
|
|
registerMLIRContextCLOptions();
|
2019-03-17 11:34:23 +08:00
|
|
|
registerPassManagerCLOptions();
|
2019-09-14 03:09:50 +08:00
|
|
|
PassPipelineCLParser passPipeline("", "Compiler passes to run");
|
2019-03-17 11:34:23 +08:00
|
|
|
|
2018-11-07 10:34:18 +08:00
|
|
|
// Parse pass names in main to ensure static initialization completed.
|
2018-06-22 06:22:42 +08:00
|
|
|
cl::ParseCommandLineOptions(argc, argv, "MLIR modular optimizer driver\n");
|
2018-06-22 00:49:33 +08:00
|
|
|
|
2020-02-19 06:56:45 +08:00
|
|
|
MLIRContext context;
|
|
|
|
if(showDialects) {
|
|
|
|
llvm::outs() << "Registered Dialects:\n";
|
|
|
|
for(Dialect *dialect : context.getRegisteredDialects()) {
|
|
|
|
llvm::outs() << dialect->getNamespace() << "\n";
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-06-23 01:39:19 +08:00
|
|
|
// Set up the input file.
|
2019-01-11 23:22:57 +08:00
|
|
|
std::string errorMessage;
|
|
|
|
auto file = openInputFile(inputFilename, &errorMessage);
|
|
|
|
if (!file) {
|
|
|
|
llvm::errs() << errorMessage << "\n";
|
2019-06-24 23:41:52 +08:00
|
|
|
return 1;
|
2018-06-23 01:39:19 +08:00
|
|
|
}
|
|
|
|
|
2019-06-24 23:41:52 +08:00
|
|
|
auto output = openOutputFile(outputFilename, &errorMessage);
|
|
|
|
if (!output) {
|
|
|
|
llvm::errs() << errorMessage << "\n";
|
|
|
|
exit(1);
|
|
|
|
}
|
2018-06-25 23:10:46 +08:00
|
|
|
|
2020-04-08 11:24:08 +08:00
|
|
|
if (failed(MlirOptMain(output->os(), std::move(file), passPipeline,
|
|
|
|
splitInputFile, verifyDiagnostics, verifyPasses,
|
|
|
|
allowUnregisteredDialects))) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
// Keep the output file if the invocation of MlirOptMain was successful.
|
|
|
|
output->keep();
|
|
|
|
return 0;
|
2018-06-22 00:49:33 +08:00
|
|
|
}
|