Skip to content

Commit 0e9523e

Browse files
committed
[mlir] Support lowering of dialect attributes attached to top-level modules
This patch supports the processing of dialect attributes attached to top-level module-type operations during MLIR-to-LLVMIR lowering. This approach modifies the `mlir::translateModuleToLLVMIR()` function to call `ModuleTranslation::convertOperation()` on the top-level operation, after its body has been lowered. This, in turn, will get the `LLVMTranslationDialectInterface` object associated to that operation's dialect before trying to use it for lowering prior to processing dialect attributes attached to the operation. Since there are no `LLVMTranslationDialectInterface`s for the builtin and GPU dialects, which define their own module-type operations, this patch also adds and registers them. The requirement for always calling `mlir::registerBuiltinDialectTranslation()` before any translation of MLIR to LLVM IR where builtin module operations are present is introduced. The purpose of these new translation interfaces is to succeed when processing module-type operations, allowing the lowering process to continue and to prevent the introduction of failures related to not finding such interfaces. Differential Revision: https://reviews.llvm.org/D145932
1 parent cdccea8 commit 0e9523e

File tree

31 files changed

+232
-3
lines changed

31 files changed

+232
-3
lines changed

flang/lib/Frontend/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ add_flang_library(flangFrontend
3434
HLFIRDialect
3535
HLFIRTransforms
3636
MLIRTransforms
37+
MLIRBuiltinToLLVMIRTranslation
3738
MLIRLLVMToLLVMIRTranslation
3839
MLIRSCFToControlFlow
3940
MLIRTargetLLVMIRImport

flang/lib/Optimizer/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_flang_library(FIRCodeGen
2323
MLIRMathToLLVM
2424
MLIRMathToLibm
2525
MLIROpenMPToLLVM
26+
MLIRBuiltinToLLVMIRTranslation
2627
MLIRLLVMToLLVMIRTranslation
2728
MLIRTargetLLVMIRExport
2829

flang/lib/Optimizer/Dialect/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_flang_library(FIRDialect
1717
LINK_LIBS
1818
FIRDialectSupport
1919
MLIRArithDialect
20+
MLIRBuiltinToLLVMIRTranslation
2021
MLIROpenMPToLLVM
2122
MLIRLLVMToLLVMIRTranslation
2223
MLIRTargetLLVMIRExport

flang/lib/Optimizer/Support/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ add_flang_library(FIRSupport
1212

1313
LINK_LIBS
1414
${dialect_libs}
15+
MLIRBuiltinToLLVMIRTranslation
1516
MLIROpenMPToLLVMIRTranslation
1617
MLIRLLVMToLLVMIRTranslation
1718
MLIRTargetLLVMIRExport

flang/lib/Optimizer/Support/InitFIR.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "flang/Optimizer/Support/InitFIR.h"
10+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
1011
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
1112
#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
1213

1314
void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
1415
mlir::DialectRegistry registry;
1516
// Register OpenMP dialect interface here as well.
16-
mlir::registerOpenMPDialectTranslation(registry);
17+
registerOpenMPDialectTranslation(registry);
1718
// Register LLVM-IR dialect interface.
1819
registerLLVMDialectTranslation(registry);
20+
// Register builtin dialect interface.
21+
registerBuiltinDialectTranslation(registry);
1922
context.appendDialectRegistry(registry);
2023
}

flang/tools/tco/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ target_link_libraries(tco PRIVATE
1717
${dialect_libs}
1818
MLIRIR
1919
MLIRLLVMDialect
20+
MLIRBuiltinToLLVMIRTranslation
2021
MLIRLLVMToLLVMIRTranslation
2122
MLIRTargetLLVMIRExport
2223
MLIRPass

mlir/examples/toy/Ch6/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ target_link_libraries(toyc-ch6
4444
${dialect_libs}
4545
${conversion_libs}
4646
MLIRAnalysis
47+
MLIRBuiltinToLLVMIRTranslation
4748
MLIRCallInterfaces
4849
MLIRCastInterfaces
4950
MLIRExecutionEngine

mlir/examples/toy/Ch6/toyc.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "mlir/Parser/Parser.h"
2828
#include "mlir/Pass/Pass.h"
2929
#include "mlir/Pass/PassManager.h"
30+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
3031
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
3132
#include "mlir/Target/LLVMIR/Export.h"
3233
#include "mlir/Transforms/Passes.h"
@@ -200,6 +201,7 @@ int dumpAST() {
200201

201202
int dumpLLVMIR(mlir::ModuleOp module) {
202203
// Register the translation to LLVM IR with the MLIR context.
204+
mlir::registerBuiltinDialectTranslation(*module->getContext());
203205
mlir::registerLLVMDialectTranslation(*module->getContext());
204206

205207
// Convert the module to LLVM IR in a new LLVM IR context.
@@ -234,6 +236,7 @@ int runJit(mlir::ModuleOp module) {
234236

235237
// Register the translation from MLIR to LLVM IR, which must happen before we
236238
// can JIT-compile.
239+
mlir::registerBuiltinDialectTranslation(*module->getContext());
237240
mlir::registerLLVMDialectTranslation(*module->getContext());
238241

239242
// An optimization pipeline to use within the execution engine.

mlir/examples/toy/Ch7/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ target_link_libraries(toyc-ch7
4343
${dialect_libs}
4444
${conversion_libs}
4545
MLIRAnalysis
46+
MLIRBuiltinToLLVMIRTranslation
4647
MLIRCallInterfaces
4748
MLIRCastInterfaces
4849
MLIRExecutionEngine

mlir/examples/toy/Ch7/toyc.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "mlir/Parser/Parser.h"
2828
#include "mlir/Pass/Pass.h"
2929
#include "mlir/Pass/PassManager.h"
30+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
3031
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
3132
#include "mlir/Target/LLVMIR/Export.h"
3233
#include "mlir/Transforms/Passes.h"
@@ -201,6 +202,7 @@ int dumpAST() {
201202

202203
int dumpLLVMIR(mlir::ModuleOp module) {
203204
// Register the translation to LLVM IR with the MLIR context.
205+
mlir::registerBuiltinDialectTranslation(*module->getContext());
204206
mlir::registerLLVMDialectTranslation(*module->getContext());
205207

206208
// Convert the module to LLVM IR in a new LLVM IR context.
@@ -235,6 +237,7 @@ int runJit(mlir::ModuleOp module) {
235237

236238
// Register the translation from MLIR to LLVM IR, which must happen before we
237239
// can JIT-compile.
240+
mlir::registerBuiltinDialectTranslation(*module->getContext());
238241
mlir::registerLLVMDialectTranslation(*module->getContext());
239242

240243
// An optimization pipeline to use within the execution engine.

mlir/include/mlir/Target/LLVMIR/Dialect/All.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "mlir/Target/LLVMIR/Dialect/AMX/AMXToLLVMIRTranslation.h"
1818
#include "mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h"
1919
#include "mlir/Target/LLVMIR/Dialect/ArmSVE/ArmSVEToLLVMIRTranslation.h"
20+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
21+
#include "mlir/Target/LLVMIR/Dialect/GPU/GPUToLLVMIRTranslation.h"
2022
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.h"
2123
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
2224
#include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h"
@@ -34,6 +36,8 @@ static inline void registerAllToLLVMIRTranslations(DialectRegistry &registry) {
3436
registerArmNeonDialectTranslation(registry);
3537
registerAMXDialectTranslation(registry);
3638
registerArmSVEDialectTranslation(registry);
39+
registerBuiltinDialectTranslation(registry);
40+
registerGPUDialectTranslation(registry);
3741
registerLLVMDialectTranslation(registry);
3842
registerNVVMDialectTranslation(registry);
3943
registerOpenACCDialectTranslation(registry);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//==- BuiltinToLLVMIRTranslation.h - Builtin Dialect to LLVM IR -*- C++ -*-==//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This provides registration calls for builtin dialect to LLVM IR translation.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
14+
#define MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
15+
16+
namespace mlir {
17+
18+
class DialectRegistry;
19+
class MLIRContext;
20+
21+
/// Register the translation from the builtin dialect to the LLVM IR in the
22+
/// given registry.
23+
void registerBuiltinDialectTranslation(DialectRegistry &registry);
24+
25+
/// Register the translation from the builtin dialect in the registry associated
26+
/// with the given context.
27+
void registerBuiltinDialectTranslation(MLIRContext &context);
28+
29+
} // namespace mlir
30+
31+
#endif // MLIR_TARGET_LLVMIR_DIALECT_BUILTIN_BUILTINTOLLVMIRTRANSLATION_H
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//===- GPUToLLVMIRTranslation.h - GPU Dialect to LLVM IR --------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This provides registration calls for GPU dialect to LLVM IR translation.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H
14+
#define MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H
15+
16+
namespace mlir {
17+
18+
class DialectRegistry;
19+
class MLIRContext;
20+
21+
/// Register the GPU dialect and the translation from it to the LLVM IR in
22+
/// the given registry;
23+
void registerGPUDialectTranslation(DialectRegistry &registry);
24+
25+
/// Register the GPU dialect and the translation from it in the registry
26+
/// associated with the given context.
27+
void registerGPUDialectTranslation(MLIRContext &context);
28+
29+
} // namespace mlir
30+
31+
#endif // MLIR_TARGET_LLVMIR_DIALECT_GPU_GPUTOLLVMIRTRANSLATION_H

mlir/lib/CAPI/ExecutionEngine/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ add_mlir_upstream_c_api_library(MLIRCAPIExecutionEngine
88
ExecutionEngine.cpp
99

1010
LINK_LIBS PUBLIC
11+
MLIRBuiltinToLLVMIRTranslation
1112
MLIRExecutionEngine
1213
MLIRLLVMToLLVMIRTranslation
1314
)

mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "mlir/CAPI/IR.h"
1212
#include "mlir/CAPI/Support.h"
1313
#include "mlir/ExecutionEngine/OptUtils.h"
14+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
1415
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
1516
#include "llvm/ExecutionEngine/Orc/Mangling.h"
1617
#include "llvm/Support/TargetSelect.h"
@@ -29,7 +30,9 @@ mlirExecutionEngineCreate(MlirModule op, int optLevel, int numPaths,
2930
}();
3031
(void)initOnce;
3132

32-
mlir::registerLLVMDialectTranslation(*unwrap(op)->getContext());
33+
auto &ctx = *unwrap(op)->getContext();
34+
mlir::registerBuiltinDialectTranslation(ctx);
35+
mlir::registerLLVMDialectTranslation(ctx);
3336

3437
auto tmBuilderOrError = llvm::orc::JITTargetMachineBuilder::detectHost();
3538
if (!tmBuilderOrError) {

mlir/lib/CAPI/RegisterEverything/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ add_mlir_upstream_c_api_library(MLIRCAPIRegisterEverything
1010
${translation_libs}
1111
${conversion_libs}
1212

13+
MLIRBuiltinToLLVMIRTranslation
1314
MLIRCAPIIR
1415
MLIRLLVMToLLVMIRTranslation
1516
MLIRCAPITransforms

mlir/lib/CAPI/RegisterEverything/RegisterEverything.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
#include "mlir/CAPI/IR.h"
1212
#include "mlir/InitAllDialects.h"
1313
#include "mlir/InitAllPasses.h"
14+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
1415
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
1516

1617
void mlirRegisterAllDialects(MlirDialectRegistry registry) {
1718
mlir::registerAllDialects(*unwrap(registry));
1819
}
1920

2021
void mlirRegisterAllLLVMTranslations(MlirContext context) {
21-
mlir::registerLLVMDialectTranslation(*unwrap(context));
22+
auto &ctx = *unwrap(context);
23+
mlir::registerBuiltinDialectTranslation(ctx);
24+
mlir::registerLLVMDialectTranslation(ctx);
2225
}
2326

2427
void mlirRegisterAllPasses() { mlir::registerAllPasses(); }

mlir/lib/Dialect/GPU/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,13 @@ add_mlir_dialect_library(MLIRGPUTransforms
7070
MLIRAffineUtils
7171
MLIRArithDialect
7272
MLIRAsyncDialect
73+
MLIRBuiltinToLLVMIRTranslation
7374
MLIRDataLayoutInterfaces
7475
MLIRExecutionEngineUtils
7576
MLIRGPUOps
7677
MLIRIR
7778
MLIRLLVMDialect
79+
MLIRGPUToLLVMIRTranslation
7880
MLIRLLVMToLLVMIRTranslation
7981
MLIRMemRefDialect
8082
MLIRPass

mlir/lib/Dialect/GPU/Transforms/SerializeToBlob.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "mlir/Dialect/GPU/Transforms/Passes.h"
1616
#include "mlir/Pass/Pass.h"
17+
#include "mlir/Target/LLVMIR/Dialect/GPU/GPUToLLVMIRTranslation.h"
1718
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
1819
#include "mlir/Target/LLVMIR/Export.h"
1920
#include "llvm/IR/LegacyPassManager.h"
@@ -108,6 +109,7 @@ gpu::SerializeToBlobPass::optimizeLlvm(llvm::Module &llvmModule,
108109

109110
void gpu::SerializeToBlobPass::getDependentDialects(
110111
DialectRegistry &registry) const {
112+
registerGPUDialectTranslation(registry);
111113
registerLLVMDialectTranslation(registry);
112114
OperationPass<gpu::GPUModuleOp>::getDependentDialects(registry);
113115
}

mlir/lib/ExecutionEngine/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ add_mlir_library(MLIRExecutionEngine
8686
${LLVM_JIT_LISTENER_LIB}
8787

8888
LINK_LIBS PUBLIC
89+
MLIRBuiltinToLLVMIRTranslation
8990
MLIRExecutionEngineUtils
9091
MLIRLLVMDialect
9192
MLIRLLVMToLLVMIRTranslation

mlir/lib/Target/LLVMIR/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ add_mlir_translation_library(MLIRToLLVMIRTranslationRegistration
4747
MLIRArmNeonToLLVMIRTranslation
4848
MLIRArmSVEToLLVMIRTranslation
4949
MLIRAMXToLLVMIRTranslation
50+
MLIRBuiltinToLLVMIRTranslation
51+
MLIRGPUToLLVMIRTranslation
5052
MLIRX86VectorToLLVMIRTranslation
5153
MLIRLLVMToLLVMIRTranslation
5254
MLIRNVVMToLLVMIRTranslation
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//===- BuiltinToLLVMIRTranslation.cpp - Translate builtin to LLVM IR ------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file implements a translation between the MLIR builtin dialect and LLVM
10+
// IR.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
14+
#include "mlir/IR/BuiltinDialect.h"
15+
#include "mlir/IR/BuiltinOps.h"
16+
#include "mlir/Target/LLVMIR/LLVMTranslationInterface.h"
17+
18+
using namespace mlir;
19+
20+
namespace {
21+
22+
class BuiltinDialectLLVMIRTranslationInterface
23+
: public LLVMTranslationDialectInterface {
24+
public:
25+
using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
26+
27+
LogicalResult
28+
convertOperation(Operation *op, llvm::IRBuilderBase &builder,
29+
LLVM::ModuleTranslation &moduleTranslation) const override {
30+
return success(isa<ModuleOp>(op));
31+
}
32+
};
33+
34+
} // namespace
35+
36+
void mlir::registerBuiltinDialectTranslation(DialectRegistry &registry) {
37+
registry.addExtension(+[](MLIRContext *ctx, BuiltinDialect *dialect) {
38+
dialect->addInterfaces<BuiltinDialectLLVMIRTranslationInterface>();
39+
});
40+
}
41+
42+
void mlir::registerBuiltinDialectTranslation(MLIRContext &context) {
43+
DialectRegistry registry;
44+
registerBuiltinDialectTranslation(registry);
45+
context.appendDialectRegistry(registry);
46+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
add_mlir_translation_library(MLIRBuiltinToLLVMIRTranslation
2+
BuiltinToLLVMIRTranslation.cpp
3+
4+
LINK_COMPONENTS
5+
Core
6+
7+
LINK_LIBS PUBLIC
8+
MLIRIR
9+
MLIRLLVMDialect
10+
MLIRSupport
11+
MLIRTargetLLVMIRExport
12+
)

mlir/lib/Target/LLVMIR/Dialect/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
add_subdirectory(ArmNeon)
22
add_subdirectory(ArmSVE)
33
add_subdirectory(AMX)
4+
add_subdirectory(Builtin)
5+
add_subdirectory(GPU)
46
add_subdirectory(LLVMIR)
57
add_subdirectory(NVVM)
68
add_subdirectory(OpenACC)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
add_mlir_translation_library(MLIRGPUToLLVMIRTranslation
2+
GPUToLLVMIRTranslation.cpp
3+
4+
LINK_COMPONENTS
5+
Core
6+
7+
LINK_LIBS PUBLIC
8+
MLIRIR
9+
MLIRGPUOps
10+
MLIRLLVMDialect
11+
MLIRSupport
12+
MLIRTargetLLVMIRExport
13+
)

0 commit comments

Comments
 (0)