Skip to content

Commit f785ca0

Browse files
authored
[mlir][nvgpu] Move memref memspace attributes conversion to single place (#172156)
Also, some fixes for AMDGPU part for better naming.
1 parent 8680feb commit f785ca0

File tree

9 files changed

+45
-70
lines changed

9 files changed

+45
-70
lines changed

mlir/include/mlir/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ void populateAMDGPUToROCDLConversionPatterns(LLVMTypeConverter &converter,
2929
RewritePatternSet &patterns,
3030
amdgpu::Chipset chipset);
3131

32+
namespace amdgpu {
3233
/// Remap common GPU memory spaces (Workgroup, Private, etc) to LLVM address
3334
/// spaces.
34-
void populateCommonAMDGPUTypeAndAttributeConversions(
35-
TypeConverter &typeConverter);
35+
void populateCommonGPUTypeAndAttributeConversions(TypeConverter &typeConverter);
36+
} // namespace amdgpu
3637

3738
/// Remap AMDGPU memory spaces to LLVM address spaces
3839
/// by mapping amdgpu::AddressSpace::fat_raw_buffer to ptr addrspace(7),

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

Lines changed: 9 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,12 @@ MemRefType getMBarrierMemrefType(MLIRContext *context,
3435
MBarrierGroupType barrierType);
3536
} // namespace nvgpu
3637

38+
namespace nvgpu {
39+
/// Remap common GPU memory spaces (Workgroup, Private, etc) to LLVM address
40+
/// spaces.
41+
void populateCommonGPUTypeAndAttributeConversions(TypeConverter &typeConverter);
42+
} // namespace nvgpu
43+
3744
void populateNVGPUToNVVMConversionPatterns(const LLVMTypeConverter &converter,
3845
RewritePatternSet &patterns);
3946
} // namespace mlir

mlir/lib/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,7 +2998,7 @@ struct ConvertAMDGPUToROCDLPass
29982998
LLVMTypeConverter converter(ctx);
29992999

30003000
populateAMDGPUToROCDLConversionPatterns(converter, patterns, *maybeChipset);
3001-
populateCommonAMDGPUTypeAndAttributeConversions(converter);
3001+
amdgpu::populateCommonGPUTypeAndAttributeConversions(converter);
30023002
LLVMConversionTarget target(getContext());
30033003
target.addIllegalDialect<::mlir::amdgpu::AMDGPUDialect>();
30043004
target.addLegalDialect<::mlir::LLVM::LLVMDialect>();
@@ -3010,7 +3010,7 @@ struct ConvertAMDGPUToROCDLPass
30103010
};
30113011
} // namespace
30123012

3013-
void mlir::populateCommonAMDGPUTypeAndAttributeConversions(
3013+
void mlir::amdgpu::populateCommonGPUTypeAndAttributeConversions(
30143014
TypeConverter &typeConverter) {
30153015
populateGpuMemorySpaceAttributeConversions(
30163016
typeConverter, [](gpu::AddressSpace space) {

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+
nvgpu::populateCommonGPUTypeAndAttributeConversions(converter);
451+
466452
// Lowering for MMAMatrixType.
467453
converter.addConversion([&](gpu::MMAMatrixType type) -> Type {
468454
return convertMMAToLLVMType(type);

mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ struct LowerGpuOpsToROCDLOpsPass final
349349
}
350350

351351
LLVMTypeConverter converter(ctx, options);
352-
populateCommonAMDGPUTypeAndAttributeConversions(converter);
352+
amdgpu::populateCommonGPUTypeAndAttributeConversions(converter);
353353

354354
RewritePatternSet llvmPatterns(ctx);
355355
LLVMConversionTarget target(getContext());

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+
nvgpu::populateCommonGPUTypeAndAttributeConversions(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::nvgpu::populateCommonGPUTypeAndAttributeConversions(
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: 3 additions & 20 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+
nvgpu::populateCommonGPUTypeAndAttributeConversions(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(
@@ -129,7 +112,7 @@ LogicalResult transform::ApplyGPUSubgroupReduceToNVVMConversionPatternsOp::
129112
void transform::ApplyGPUToROCDLConversionPatternsOp::populatePatterns(
130113
TypeConverter &typeConverter, RewritePatternSet &patterns) {
131114
auto &llvmTypeConverter = static_cast<LLVMTypeConverter &>(typeConverter);
132-
populateCommonAMDGPUTypeAndAttributeConversions(llvmTypeConverter);
115+
amdgpu::populateCommonGPUTypeAndAttributeConversions(llvmTypeConverter);
133116
FailureOr<amdgpu::Chipset> maybeChipset =
134117
amdgpu::Chipset::parse(getChipset());
135118
assert(llvm::succeeded(maybeChipset) && "expected valid chipset");

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+
nvgpu::populateCommonGPUTypeAndAttributeConversions(llvmTypeConverter);
6553
llvmTypeConverter.addConversion([&](DeviceAsyncTokenType type) -> Type {
6654
return llvmTypeConverter.convertType(
6755
IntegerType::get(type.getContext(), 32));

0 commit comments

Comments
 (0)