Skip to content

Commit db791cc

Browse files
committed
[mlir][nvgpu] Move memref memspace attributes conversion to single place
1 parent f3c1645 commit db791cc

File tree

6 files changed

+37
-64
lines changed

6 files changed

+37
-64
lines changed

mlir/include/mlir/Conversion/NVGPUToNVVM/NVGPUToNVVM.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ namespace mlir {
1414

1515
class Attribute;
1616
class LLVMTypeConverter;
17-
class MemRefType;
1817
class MLIRContext;
19-
class RewritePatternSet;
18+
class MemRefType;
2019
class Pass;
20+
class RewritePatternSet;
21+
class TypeConverter;
2122

2223
#define GEN_PASS_DECL_CONVERTNVGPUTONVVMPASS
2324
#include "mlir/Conversion/Passes.h.inc"
@@ -34,6 +35,11 @@ MemRefType getMBarrierMemrefType(MLIRContext *context,
3435
MBarrierGroupType barrierType);
3536
} // namespace nvgpu
3637

38+
/// Remap common GPU memory spaces (Workgroup, Private, etc) to LLVM address
39+
/// spaces.
40+
void populateCommonNVGPUTypeAndAttributeConversions(
41+
TypeConverter &typeConverter);
42+
3743
void populateNVGPUToNVVMConversionPatterns(const LLVMTypeConverter &converter,
3844
RewritePatternSet &patterns);
3945
} // namespace mlir

mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ add_mlir_conversion_library(MLIRGPUToNVVMTransforms
1919
MLIRLLVMDialect
2020
MLIRMemRefToLLVM
2121
MLIRNVGPUDialect
22+
MLIRNVGPUToNVVM
2223
MLIRNVVMDialect
2324
MLIRPass
2425
MLIRTransformUtils

mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
2020
#include "mlir/Conversion/LLVMCommon/LoweringOptions.h"
2121
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
22+
#include "mlir/Conversion/NVGPUToNVVM/NVGPUToNVVM.h"
2223
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
2324
#include "mlir/Dialect/Func/IR/FuncOps.h"
2425
#include "mlir/Dialect/GPU/IR/GPUDialect.h"
@@ -446,23 +447,8 @@ void mlir::configureGpuToNVVMConversionLegality(ConversionTarget &target) {
446447
}
447448

448449
void mlir::configureGpuToNVVMTypeConverter(LLVMTypeConverter &converter) {
449-
// NVVM uses alloca in the default address space to represent private
450-
// memory allocations, so drop private annotations. NVVM uses address
451-
// space 3 for shared memory. NVVM uses the default address space to
452-
// represent global memory.
453-
populateGpuMemorySpaceAttributeConversions(
454-
converter, [](gpu::AddressSpace space) -> unsigned {
455-
switch (space) {
456-
case gpu::AddressSpace::Global:
457-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Global);
458-
case gpu::AddressSpace::Workgroup:
459-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Shared);
460-
case gpu::AddressSpace::Private:
461-
return 0;
462-
}
463-
llvm_unreachable("unknown address space enum value");
464-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Generic);
465-
});
450+
populateCommonNVGPUTypeAndAttributeConversions(converter);
451+
466452
// Lowering for MMAMatrixType.
467453
converter.addConversion([&](gpu::MMAMatrixType type) -> Type {
468454
return convertMMAToLLVMType(type);

mlir/lib/Conversion/NVGPUToNVVM/NVGPUToNVVM.cpp

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -401,19 +401,8 @@ struct ConvertNVGPUToNVVMPass
401401
RewritePatternSet patterns(&getContext());
402402
LLVMTypeConverter converter(&getContext(), options);
403403
IRRewriter rewriter(&getContext());
404-
populateGpuMemorySpaceAttributeConversions(
405-
converter, [](gpu::AddressSpace space) -> unsigned {
406-
switch (space) {
407-
case gpu::AddressSpace::Global:
408-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Global);
409-
case gpu::AddressSpace::Workgroup:
410-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Shared);
411-
case gpu::AddressSpace::Private:
412-
return 0;
413-
}
414-
llvm_unreachable("unknown address space enum value");
415-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Generic);
416-
});
404+
populateCommonNVGPUTypeAndAttributeConversions(converter);
405+
417406
/// device-side async tokens cannot be materialized in nvvm. We just
418407
/// convert them to a dummy i32 type in order to easily drop them during
419408
/// conversion.
@@ -1719,6 +1708,26 @@ struct NVGPURcpOpLowering : public ConvertOpToLLVMPattern<nvgpu::RcpOp> {
17191708
};
17201709
} // namespace
17211710

1711+
void mlir::populateCommonNVGPUTypeAndAttributeConversions(
1712+
TypeConverter &typeConverter) {
1713+
// NVVM uses alloca in the default address space to represent private
1714+
// memory allocations, so drop private annotations. NVVM uses address
1715+
// space 3 for shared memory. NVVM uses the default address space to
1716+
// represent global memory.
1717+
populateGpuMemorySpaceAttributeConversions(
1718+
typeConverter, [](gpu::AddressSpace space) -> unsigned {
1719+
switch (space) {
1720+
case gpu::AddressSpace::Global:
1721+
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Global);
1722+
case gpu::AddressSpace::Workgroup:
1723+
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Shared);
1724+
case gpu::AddressSpace::Private:
1725+
return 0;
1726+
}
1727+
llvm_unreachable("unknown address space enum value");
1728+
});
1729+
}
1730+
17221731
void mlir::populateNVGPUToNVVMConversionPatterns(
17231732
const LLVMTypeConverter &converter, RewritePatternSet &patterns) {
17241733
patterns.add<

mlir/lib/Dialect/GPU/TransformOps/GPUTransformOps.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "mlir/Conversion/GPUToNVVM/GPUToNVVMPass.h"
1414
#include "mlir/Conversion/GPUToROCDL/GPUToROCDLPass.h"
1515
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
16+
#include "mlir/Conversion/NVGPUToNVVM/NVGPUToNVVM.h"
1617
#include "mlir/Dialect/AMDGPU/IR/AMDGPUDialect.h"
1718
#include "mlir/Dialect/AMDGPU/Utils/Chipset.h"
1819
#include "mlir/Dialect/Arith/IR/Arith.h"
@@ -62,25 +63,7 @@ using namespace mlir::transform::gpu;
6263
void transform::ApplyGPUToNVVMConversionPatternsOp::populatePatterns(
6364
TypeConverter &typeConverter, RewritePatternSet &patterns) {
6465
auto &llvmTypeConverter = static_cast<LLVMTypeConverter &>(typeConverter);
65-
// NVVM uses alloca in the default address space to represent private
66-
// memory allocations, so drop private annotations. NVVM uses address
67-
// space 3 for shared memory. NVVM uses the default address space to
68-
// represent global memory.
69-
// Used in populateGpuToNVVMConversionPatternsso attaching here for now.
70-
// TODO: We should have a single to_nvvm_type_converter.
71-
populateGpuMemorySpaceAttributeConversions(
72-
llvmTypeConverter, [](AddressSpace space) -> unsigned {
73-
switch (space) {
74-
case AddressSpace::Global:
75-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Global);
76-
case AddressSpace::Workgroup:
77-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Shared);
78-
case AddressSpace::Private:
79-
return 0;
80-
}
81-
llvm_unreachable("unknown address space enum value");
82-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Generic);
83-
});
66+
populateCommonNVGPUTypeAndAttributeConversions(llvmTypeConverter);
8467
// Used in GPUToNVVM/WmmaOpsToNvvm.cpp so attaching here for now.
8568
// TODO: We should have a single to_nvvm_type_converter.
8669
llvmTypeConverter.addConversion(

mlir/lib/Dialect/NVGPU/TransformOps/NVGPUTransformOps.cpp

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,7 @@ void ApplyNVGPUToNVVMConversionPatternsOp::populatePatterns(
4949
/// device-side async tokens cannot be materialized in nvvm. We just
5050
/// convert them to a dummy i32 type in order to easily drop them during
5151
/// conversion.
52-
populateGpuMemorySpaceAttributeConversions(
53-
llvmTypeConverter, [](gpu::AddressSpace space) -> unsigned {
54-
switch (space) {
55-
case gpu::AddressSpace::Global:
56-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Global);
57-
case gpu::AddressSpace::Workgroup:
58-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Shared);
59-
case gpu::AddressSpace::Private:
60-
return 0;
61-
}
62-
llvm_unreachable("unknown address space enum value");
63-
return static_cast<unsigned>(NVVM::NVVMMemorySpace::Generic);
64-
});
52+
populateCommonNVGPUTypeAndAttributeConversions(llvmTypeConverter);
6553
llvmTypeConverter.addConversion([&](DeviceAsyncTokenType type) -> Type {
6654
return llvmTypeConverter.convertType(
6755
IntegerType::get(type.getContext(), 32));

0 commit comments

Comments
 (0)