diff --git a/flang/include/flang/Optimizer/Dialect/FIRDialect.h b/flang/include/flang/Optimizer/Dialect/FIRDialect.h index e8bf9f0cf503b2..440fe77059a4a7 100644 --- a/flang/include/flang/Optimizer/Dialect/FIRDialect.h +++ b/flang/include/flang/Optimizer/Dialect/FIRDialect.h @@ -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 diff --git a/flang/include/flang/Optimizer/Support/InitFIR.h b/flang/include/flang/Optimizer/Support/InitFIR.h index b5c41699205f42..f376840afd842a 100644 --- a/flang/include/flang/Optimizer/Support/InitFIR.h +++ b/flang/include/flang/Optimizer/Support/InitFIR.h @@ -53,6 +53,13 @@ inline void registerDialects(mlir::DialectRegistry ®istry) { registry.insert(); } +// 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); diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 18bc1689c85473..44e80e946ed832 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -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 diff --git a/flang/lib/Optimizer/Dialect/FIRDialect.cpp b/flang/lib/Optimizer/Dialect/FIRDialect.cpp index d0176731c292d3..f4589fda184587 100644 --- a/flang/lib/Optimizer/Dialect/FIRDialect.cpp +++ b/flang/lib/Optimizer/Dialect/FIRDialect.cpp @@ -67,7 +67,14 @@ fir::FIROpsDialect::FIROpsDialect(mlir::MLIRContext *ctx) #include "flang/Optimizer/Dialect/FIROps.cpp.inc" >(); registerOpExternalInterfaces(); - addInterfaces(); +} + +// Register the FIRInlinerInterface to FIROpsDialect +void fir::addFIRInlinerExtension(mlir::DialectRegistry ®istry) { + registry.addExtension( + +[](mlir::MLIRContext *ctx, fir::FIROpsDialect *dialect) { + dialect->addInterface(); + }); } // anchor the class vtable to this compilation unit diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp index 98d9258e023e55..9d5caf5c6804ea 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -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(); diff --git a/flang/tools/fir-opt/fir-opt.cpp b/flang/tools/fir-opt/fir-opt.cpp index 92af79e50fa4e1..1846c1b317848f 100644 --- a/flang/tools/fir-opt/fir-opt.cpp +++ b/flang/tools/fir-opt/fir-opt.cpp @@ -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)); } diff --git a/flang/tools/tco/tco.cpp b/flang/tools/tco/tco.cpp index 2153e0e3e62492..45284e74f58456 100644 --- a/flang/tools/tco/tco.cpp +++ b/flang/tools/tco/tco.cpp @@ -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);