[Mlir-commits] [mlir] 9e7b6f4 - [mlir] Adopt `ConvertToLLVMPatternInterface` GpuToLLVMConversionPass to align with `convert-to-llvm` (#73761)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Nov 29 11:37:58 PST 2023
Author: Mehdi Amini
Date: 2023-11-29T11:37:53-08:00
New Revision: 9e7b6f46ba13ef0bac72e18b425aed37f576fb1e
URL: https://github.com/llvm/llvm-project/commit/9e7b6f46ba13ef0bac72e18b425aed37f576fb1e
DIFF: https://github.com/llvm/llvm-project/commit/9e7b6f46ba13ef0bac72e18b425aed37f576fb1e.diff
LOG: [mlir] Adopt `ConvertToLLVMPatternInterface` GpuToLLVMConversionPass to align with `convert-to-llvm` (#73761)
This is a follow-up to the introduction of `convert-to-llvm`: it is
supposed to be a unifying pass through the
`ConvertToLLVMPatternInterface`, but some specific conversion (like the
GPU target) aren't vanilla LLVM target. Instead they need extra
customizations that are specific to LLVM-on-GPUs and our custom runtime
wrappers.
This change make the GpuToLLVMConversionPass just as pluggable as the
`convert-to-llvm` by using the same mechanism.
Added:
Modified:
mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMPass.h
mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMPass.h b/mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMPass.h
index 2eddf52d7abc520..73deef49c4175d3 100644
--- a/mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMPass.h
+++ b/mlir/include/mlir/Conversion/ConvertToLLVM/ToLLVMPass.h
@@ -22,6 +22,10 @@ namespace mlir {
/// implementing `ConvertToLLVMPatternInterface`.
std::unique_ptr<Pass> createConvertToLLVMPass();
+/// Register the extension that will load dependent dialects for LLVM
+/// conversion. This is useful to implement a pass similar to "convert-to-llvm".
+void registerConvertToLLVMDependentDialectLoading(DialectRegistry ®istry);
+
} // namespace mlir
#endif // MLIR_CONVERSION_CONVERTTOLLVM_TOLLVM_PASS_H
diff --git a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
index a90e557b1fdbd9c..6135117348a5b86 100644
--- a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
+++ b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
@@ -124,6 +124,11 @@ class ConvertToLLVMPass
} // namespace
+void mlir::registerConvertToLLVMDependentDialectLoading(
+ DialectRegistry ®istry) {
+ registry.addExtensions<LoadDependentDialectExtension>();
+}
+
std::unique_ptr<Pass> mlir::createConvertToLLVMPass() {
return std::make_unique<ConvertToLLVMPass>();
}
diff --git a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
index 2da97c20e9c984e..75dee09d2f64fd0 100644
--- a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
+++ b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
@@ -18,6 +18,8 @@
#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
#include "mlir/Conversion/AsyncToLLVM/AsyncToLLVM.h"
#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
+#include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
+#include "mlir/Conversion/ConvertToLLVM/ToLLVMPass.h"
#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVMPass.h"
#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
@@ -38,6 +40,8 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/FormatVariadic.h"
+#define DEBUG_TYPE "gpu-to-llvm"
+
namespace mlir {
#define GEN_PASS_DEF_GPUTOLLVMCONVERSIONPASS
#include "mlir/Conversion/Passes.h.inc"
@@ -48,12 +52,14 @@ using namespace mlir;
static constexpr const char *kGpuBinaryStorageSuffix = "_gpubin_cst";
namespace {
-
class GpuToLLVMConversionPass
: public impl::GpuToLLVMConversionPassBase<GpuToLLVMConversionPass> {
public:
using Base::Base;
-
+ void getDependentDialects(DialectRegistry ®istry) const final {
+ Base::getDependentDialects(registry);
+ registerConvertToLLVMDependentDialectLoading(registry);
+ }
// Run the dialect converter on the module.
void runOnOperation() override;
};
@@ -580,14 +586,24 @@ DECLARE_CONVERT_OP_TO_GPU_RUNTIME_CALL_PATTERN(SetCsrPointersOp)
} // namespace
void GpuToLLVMConversionPass::runOnOperation() {
- LowerToLLVMOptions options(&getContext());
+ MLIRContext *context = &getContext();
+ SymbolTable symbolTable = SymbolTable(getOperation());
+ LowerToLLVMOptions options(context);
options.useBarePtrCallConv = hostBarePtrCallConv;
+ RewritePatternSet patterns(context);
+ ConversionTarget target(*context);
+ target.addLegalDialect<LLVM::LLVMDialect>();
+ LLVMTypeConverter converter(context, options);
+
+ // Populate all patterns from all dialects that implement the
+ // `ConvertToLLVMPatternInterface` interface.
+ for (Dialect *dialect : context->getLoadedDialects()) {
+ auto iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
+ if (!iface)
+ continue;
+ iface->populateConvertToLLVMConversionPatterns(target, converter, patterns);
+ }
- LLVMTypeConverter converter(&getContext(), options);
- RewritePatternSet patterns(&getContext());
- LLVMConversionTarget target(getContext());
-
- SymbolTable symbolTable = SymbolTable(getOperation());
// Preserve GPU modules if they have target attributes.
target.addDynamicallyLegalOp<gpu::GPUModuleOp>(
[](gpu::GPUModuleOp module) -> bool {
@@ -605,11 +621,9 @@ void GpuToLLVMConversionPass::runOnOperation() {
!module.getTargetsAttr().empty());
});
- mlir::arith::populateArithToLLVMConversionPatterns(converter, patterns);
- mlir::cf::populateControlFlowToLLVMConversionPatterns(converter, patterns);
+ // These aren't covered by the ConvertToLLVMPatternInterface right now.
populateVectorToLLVMConversionPatterns(converter, patterns);
populateFinalizeMemRefToLLVMConversionPatterns(converter, patterns);
- populateFuncToLLVMConversionPatterns(converter, patterns);
populateAsyncStructuralTypeConversionsAndLegality(converter, patterns,
target);
populateGpuToLLVMConversionPatterns(converter, patterns, gpuBinaryAnnotation,
More information about the Mlir-commits
mailing list