[flang] Introducing a method to dynamically and conditionally register dialect interfaces. (#80881)
This change introduces the `addFIRExtensions` method to dynamically and conditionally register dialect interfaces. As a use case of `addFIRExtensions`, this change moves the static registration of `FIRInlinerInterface` out of the constructor of `FIROpsDialect` to be dynamically registered while loading the necessary MLIR dialects required by Flang. This registration of `FIRInlinerInterface` is also guarded by a boolean `addFIRInlinerInterface` which defaults to true. --------- Co-authored-by: Vijay Kandiah <vkandiah@nvidia.com>
This commit is contained in:
@@ -67,6 +67,9 @@ bool canLegallyInline(mlir::Operation *op, mlir::Region *reg, bool,
|
||||
mlir::IRMapping &map);
|
||||
bool canLegallyInline(mlir::Operation *, mlir::Operation *, bool);
|
||||
|
||||
// Register the FIRInlinerInterface to FIROpsDialect
|
||||
void addFIRInlinerExtension(mlir::DialectRegistry ®istry);
|
||||
|
||||
} // namespace fir
|
||||
|
||||
#endif // FORTRAN_OPTIMIZER_DIALECT_FIRDIALECT_H
|
||||
|
||||
@@ -53,6 +53,13 @@ inline void registerDialects(mlir::DialectRegistry ®istry) {
|
||||
registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
|
||||
}
|
||||
|
||||
// Register FIR Extensions
|
||||
inline void addFIRExtensions(mlir::DialectRegistry ®istry,
|
||||
bool addFIRInlinerInterface = true) {
|
||||
if (addFIRInlinerInterface)
|
||||
addFIRInlinerExtension(registry);
|
||||
}
|
||||
|
||||
inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
|
||||
mlir::DialectRegistry registry;
|
||||
registerNonCodegenDialects(registry);
|
||||
|
||||
@@ -786,6 +786,10 @@ void CodeGenAction::generateLLVMIR() {
|
||||
llvm::OptimizationLevel level = mapToLevel(opts);
|
||||
|
||||
fir::support::loadDialects(*mlirCtx);
|
||||
mlir::DialectRegistry registry;
|
||||
fir::support::registerNonCodegenDialects(registry);
|
||||
fir::support::addFIRExtensions(registry);
|
||||
mlirCtx->appendDialectRegistry(registry);
|
||||
fir::support::registerLLVMTranslation(*mlirCtx);
|
||||
|
||||
// Set-up the MLIR pass manager
|
||||
|
||||
@@ -67,7 +67,14 @@ fir::FIROpsDialect::FIROpsDialect(mlir::MLIRContext *ctx)
|
||||
#include "flang/Optimizer/Dialect/FIROps.cpp.inc"
|
||||
>();
|
||||
registerOpExternalInterfaces();
|
||||
addInterfaces<FIRInlinerInterface>();
|
||||
}
|
||||
|
||||
// Register the FIRInlinerInterface to FIROpsDialect
|
||||
void fir::addFIRInlinerExtension(mlir::DialectRegistry ®istry) {
|
||||
registry.addExtension(
|
||||
+[](mlir::MLIRContext *ctx, fir::FIROpsDialect *dialect) {
|
||||
dialect->addInterface<FIRInlinerInterface>();
|
||||
});
|
||||
}
|
||||
|
||||
// anchor the class vtable to this compilation unit
|
||||
|
||||
@@ -326,6 +326,7 @@ static mlir::LogicalResult convertFortranSourceToMLIR(
|
||||
// translate to FIR dialect of MLIR
|
||||
mlir::DialectRegistry registry;
|
||||
fir::support::registerNonCodegenDialects(registry);
|
||||
fir::support::addFIRExtensions(registry);
|
||||
mlir::MLIRContext ctx(registry);
|
||||
fir::support::loadNonCodegenDialects(ctx);
|
||||
auto &defKinds = semanticsContext.defaultKinds();
|
||||
|
||||
@@ -40,6 +40,7 @@ int main(int argc, char **argv) {
|
||||
#endif
|
||||
DialectRegistry registry;
|
||||
fir::support::registerDialects(registry);
|
||||
fir::support::addFIRExtensions(registry);
|
||||
return failed(MlirOptMain(argc, argv, "FIR modular optimizer driver\n",
|
||||
registry));
|
||||
}
|
||||
|
||||
@@ -90,6 +90,7 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
|
||||
sourceMgr.AddNewSourceBuffer(std::move(*fileOrErr), SMLoc());
|
||||
mlir::DialectRegistry registry;
|
||||
fir::support::registerDialects(registry);
|
||||
fir::support::addFIRExtensions(registry);
|
||||
mlir::MLIRContext context(registry);
|
||||
fir::support::loadDialects(context);
|
||||
fir::support::registerLLVMTranslation(context);
|
||||
|
||||
Reference in New Issue
Block a user