[Mlir-commits] [mlir] [MLIR][NVVM] Update MLIR mapa to reflect new address space (PR #146031)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Aug 7 14:32:21 PDT 2025
https://github.com/modiking updated https://github.com/llvm/llvm-project/pull/146031
>From 8ed4b84a4a8a1344770ce6996f42a52eabf0072b Mon Sep 17 00:00:00 2001
From: Modi Mo <mmo at nvidia.com>
Date: Thu, 26 Jun 2025 23:25:05 -0700
Subject: [PATCH 1/4] update mapa
---
mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td | 25 ++++++++++++++++++---
mlir/test/Dialect/LLVMIR/invalid.mlir | 4 ++--
mlir/test/Dialect/LLVMIR/nvvm.mlir | 2 +-
mlir/test/Target/LLVMIR/nvvmir.mlir | 4 ++--
4 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
index 45a8904375e2b..52f7dbab6f61b 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
@@ -3015,10 +3015,29 @@ def NVVM_GriddepcontrolLaunchDependentsOp
// NVVM Mapa Op
//===----------------------------------------------------------------------===//
+// Helper predicates for address space checking
+def IsGenericAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 0">;
+def IsSharedAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 3">;
+def IsSharedClusterAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 7">;
+
+class NVVM_AddressSpaceMapping<string inputArg, string resultArg> :
+ PredOpTrait<"valid address space mapping for NVVM mapa operation",
+ Or<[
+ // Generic -> Generic
+ And<[
+ SubstLeaves<"$_self", "$" # inputArg # ".getType()", IsGenericAddressSpace>,
+ SubstLeaves<"$_self", "$" # resultArg # ".getType()", IsGenericAddressSpace>
+ ]>,
+ // Shared -> SharedCluster
+ And<[
+ SubstLeaves<"$_self", "$" # inputArg # ".getType()", IsSharedAddressSpace>,
+ SubstLeaves<"$_self", "$" # resultArg # ".getType()", IsSharedClusterAddressSpace>
+ ]>
+ ]>>;
+
def NVVM_MapaOp: NVVM_Op<"mapa",
- [TypesMatchWith<"`res` and `a` should have the same type",
- "a", "res", "$_self">, NVVMRequiresSM<90>]> {
- let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$res);
+ [NVVM_AddressSpaceMapping<"a", "res">, NVVMRequiresSM<90>]> {
+ let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerSharedCluster]>:$res);
let arguments = (ins AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$a, I32:$b);
string llvmBuilder = [{
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index bd1106e304c60..1ac4477e7c7ea 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -1201,8 +1201,8 @@ func.func @cp_async(%arg0: !llvm.ptr<3>, %arg1: !llvm.ptr<1>) {
// -----
func.func @mapa(%a: !llvm.ptr, %b : i32) {
- // expected-error @below {{`res` and `a` should have the same type}}
- %0 = nvvm.mapa %a, %b: !llvm.ptr -> !llvm.ptr<3>
+ // expected-error @below {{'nvvm.mapa' op failed to verify that valid address space mapping for NVVM mapa operation}}
+ %0 = nvvm.mapa %a, %b: !llvm.ptr -> !llvm.ptr<7>
return
}
diff --git a/mlir/test/Dialect/LLVMIR/nvvm.mlir b/mlir/test/Dialect/LLVMIR/nvvm.mlir
index c7fa41c98ac92..4349193aa1a45 100644
--- a/mlir/test/Dialect/LLVMIR/nvvm.mlir
+++ b/mlir/test/Dialect/LLVMIR/nvvm.mlir
@@ -552,7 +552,7 @@ func.func @mapa(%a: !llvm.ptr, %a_shared: !llvm.ptr<3>, %b : i32) {
// CHECK: nvvm.mapa %{{.*}}
%0 = nvvm.mapa %a, %b: !llvm.ptr -> !llvm.ptr
// CHECK: nvvm.mapa %{{.*}}
- %1 = nvvm.mapa %a_shared, %b: !llvm.ptr<3> -> !llvm.ptr<3>
+ %1 = nvvm.mapa %a_shared, %b: !llvm.ptr<3> -> !llvm.ptr<7>
return
}
diff --git a/mlir/test/Target/LLVMIR/nvvmir.mlir b/mlir/test/Target/LLVMIR/nvvmir.mlir
index f86a04186f512..c119c1a0fd21f 100644
--- a/mlir/test/Target/LLVMIR/nvvmir.mlir
+++ b/mlir/test/Target/LLVMIR/nvvmir.mlir
@@ -760,8 +760,8 @@ llvm.func @nvvm_griddepcontrol_launch_dependents() {
llvm.func @nvvm_mapa(%a: !llvm.ptr, %a_shared: !llvm.ptr<3>, %b : i32) {
// CHECK-LLVM: call ptr @llvm.nvvm.mapa(ptr %{{.*}}, i32 %{{.*}})
%0 = nvvm.mapa %a, %b: !llvm.ptr -> !llvm.ptr
- // CHECK-LLVM: call ptr addrspace(3) @llvm.nvvm.mapa.shared.cluster(ptr addrspace(3) %{{.*}}, i32 %{{.*}})
- %1 = nvvm.mapa %a_shared, %b: !llvm.ptr<3> -> !llvm.ptr<3>
+ // CHECK-LLVM: call ptr addrspace(7) @llvm.nvvm.mapa.shared.cluster(ptr addrspace(3) %{{.*}}, i32 %{{.*}})
+ %1 = nvvm.mapa %a_shared, %b: !llvm.ptr<3> -> !llvm.ptr<7>
llvm.return
}
>From 1ebeca710878b21e27aa92278abef1797bd35ec3 Mon Sep 17 00:00:00 2001
From: Modi Mo <mmo at nvidia.com>
Date: Tue, 1 Jul 2025 15:27:23 -0700
Subject: [PATCH 2/4] review feedback
---
mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td | 6 +++---
mlir/test/Dialect/LLVMIR/invalid.mlir | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
index 52f7dbab6f61b..20387ed892ab1 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
@@ -3020,8 +3020,8 @@ def IsGenericAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).get
def IsSharedAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 3">;
def IsSharedClusterAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 7">;
-class NVVM_AddressSpaceMapping<string inputArg, string resultArg> :
- PredOpTrait<"valid address space mapping for NVVM mapa operation",
+class NVVM_MapaASCheck<string inputArg, string resultArg> :
+ PredOpTrait<"Valid address-space check(or mapping) for mapa Op",
Or<[
// Generic -> Generic
And<[
@@ -3036,7 +3036,7 @@ class NVVM_AddressSpaceMapping<string inputArg, string resultArg> :
]>>;
def NVVM_MapaOp: NVVM_Op<"mapa",
- [NVVM_AddressSpaceMapping<"a", "res">, NVVMRequiresSM<90>]> {
+ [NVVM_MapaASCheck<"a", "res">, NVVMRequiresSM<90>]> {
let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerSharedCluster]>:$res);
let arguments = (ins AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$a, I32:$b);
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index 1ac4477e7c7ea..d3843897a9c5a 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -1201,7 +1201,7 @@ func.func @cp_async(%arg0: !llvm.ptr<3>, %arg1: !llvm.ptr<1>) {
// -----
func.func @mapa(%a: !llvm.ptr, %b : i32) {
- // expected-error @below {{'nvvm.mapa' op failed to verify that valid address space mapping for NVVM mapa operation}}
+ // expected-error @below {{'nvvm.mapa' op failed to verify that Valid address-space check(or mapping) for mapa Op}}
%0 = nvvm.mapa %a, %b: !llvm.ptr -> !llvm.ptr<7>
return
}
>From 50d6536baa580ce0fa2938087fcd0925017abdd4 Mon Sep 17 00:00:00 2001
From: Modi Mo <mmo at nvidia.com>
Date: Thu, 3 Jul 2025 20:37:44 -0700
Subject: [PATCH 3/4] make generic helper and update usage to it
---
mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td | 27 ++++-----------------
mlir/include/mlir/IR/OpBase.td | 16 ++++++++++++
2 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
index 20387ed892ab1..ee0e6e03b4c4c 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
@@ -3015,28 +3015,11 @@ def NVVM_GriddepcontrolLaunchDependentsOp
// NVVM Mapa Op
//===----------------------------------------------------------------------===//
-// Helper predicates for address space checking
-def IsGenericAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 0">;
-def IsSharedAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 3">;
-def IsSharedClusterAddressSpace : CPred<"llvm::cast<LLVM::LLVMPointerType>($_self).getAddressSpace() == 7">;
-
-class NVVM_MapaASCheck<string inputArg, string resultArg> :
- PredOpTrait<"Valid address-space check(or mapping) for mapa Op",
- Or<[
- // Generic -> Generic
- And<[
- SubstLeaves<"$_self", "$" # inputArg # ".getType()", IsGenericAddressSpace>,
- SubstLeaves<"$_self", "$" # resultArg # ".getType()", IsGenericAddressSpace>
- ]>,
- // Shared -> SharedCluster
- And<[
- SubstLeaves<"$_self", "$" # inputArg # ".getType()", IsSharedAddressSpace>,
- SubstLeaves<"$_self", "$" # resultArg # ".getType()", IsSharedClusterAddressSpace>
- ]>
- ]>>;
-
-def NVVM_MapaOp: NVVM_Op<"mapa",
- [NVVM_MapaASCheck<"a", "res">, NVVMRequiresSM<90>]> {
+def NVVM_MapaASCheck : PredOpTrait<"Valid address-space check(or mapping) for mapa Op",
+ Or<[InputMatchesTypes<["a", "res"], [LLVM_PointerShared, LLVM_PointerSharedCluster]>.predicate,
+ InputMatchesTypes<["a", "res"], [LLVM_PointerGeneric, LLVM_PointerGeneric]>.predicate]>>;
+
+def NVVM_MapaOp: NVVM_Op<"mapa", [NVVM_MapaASCheck, NVVMRequiresSM<90>]> {
let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerSharedCluster]>:$res);
let arguments = (ins AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$a, I32:$b);
diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td
index 43ef28624fb19..b21603a410c0c 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -603,6 +603,22 @@ class RangedTypesMatchWith<string summary, string lhsArg, string rhsArg,
string transform>
: TypesMatchWith<summary, lhsArg, rhsArg, transform, "llvm::equal">;
+// Checks that each inputArg has the same type as the corresponding entry
+// in allowedTypes
+class InputMatchesTypes<list<string> inputArgs, list<Type> allowedTypes> :
+ PredOpTrait<"operands {" # !interleave(inputArgs, ", ") # "} match expected types",
+ !foldl(TruePred, !range(!size(inputArgs)), acc, i,
+ And<[acc,
+ SubstLeaves<"$_self", "$" # inputArgs[i] # ".getType()",
+ allowedTypes[i].predicate>
+ ]>)> {
+ assert !eq(!size(inputArgs), !size(allowedTypes)),
+ "inputArgs and allowedTypes lists must have the same length";
+
+ list<string> inputArgList = inputArgs;
+ list<Type> allowedTypeList = allowedTypes;
+}
+
// Type Constraint operand `idx`'s Element type is `type`.
class TCopVTEtIs<int idx, Type type> : And<[
CPred<"$_op.getNumOperands() > " # idx>,
>From 8437c77c5008b977e396201cab29beab3fc7eebe Mon Sep 17 00:00:00 2001
From: Modi Mo <mmo at nvidia.com>
Date: Wed, 16 Jul 2025 14:23:53 -0700
Subject: [PATCH 4/4] create InputAddressIsCombinationOf
---
mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td | 9 +++----
mlir/include/mlir/IR/OpBase.td | 29 +++++++++++++++++++++
2 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
index ee0e6e03b4c4c..5043b8ef598b2 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
@@ -3015,11 +3015,10 @@ def NVVM_GriddepcontrolLaunchDependentsOp
// NVVM Mapa Op
//===----------------------------------------------------------------------===//
-def NVVM_MapaASCheck : PredOpTrait<"Valid address-space check(or mapping) for mapa Op",
- Or<[InputMatchesTypes<["a", "res"], [LLVM_PointerShared, LLVM_PointerSharedCluster]>.predicate,
- InputMatchesTypes<["a", "res"], [LLVM_PointerGeneric, LLVM_PointerGeneric]>.predicate]>>;
-
-def NVVM_MapaOp: NVVM_Op<"mapa", [NVVM_MapaASCheck, NVVMRequiresSM<90>]> {
+def NVVM_MapaOp: NVVM_Op<"mapa",
+ [InputAddressIsCombinationOf<["a", "res"],
+ [[LLVM_PointerShared, LLVM_PointerSharedCluster], [LLVM_PointerGeneric, LLVM_PointerGeneric]],
+ "Valid address-space check(or mapping) for mapa Op">, NVVMRequiresSM<90>]> {
let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerSharedCluster]>:$res);
let arguments = (ins AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$a, I32:$b);
diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td
index b21603a410c0c..e59a70a547a29 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -619,6 +619,35 @@ class InputMatchesTypes<list<string> inputArgs, list<Type> allowedTypes> :
list<Type> allowedTypeList = allowedTypes;
}
+// Checks that inputArgs match one of the allowed type combinations.
+// Each combination in allowedCombinations must have the same number of types
+// as there are inputArgs.
+class InputAddressIsCombinationOf<list<string> inputArgs,
+ list<list<Type>> allowedCombinations,
+ string description = ""> :
+ PredOpTrait<!if(!empty(description),
+ "operands {" # !interleave(inputArgs, ", ") # "} match one of the allowed type combinations",
+ description),
+ Or<!foreach(combination, allowedCombinations,
+ !foldl(TruePred, !range(!size(inputArgs)), acc, i,
+ And<[acc,
+ SubstLeaves<"$_self", "$" # inputArgs[i] # ".getType()",
+ combination[i].predicate>
+ ]>))>> {
+ assert !gt(!size(allowedCombinations), 0),
+ "allowedCombinations must not be empty";
+
+ // Validate that each combination has the same number of types as inputArgs
+ defvar inputArgSize = !size(inputArgs);
+ defvar validSizes = !foldl(1, allowedCombinations, acc, combination,
+ !and(acc, !eq(inputArgSize, !size(combination))));
+ assert validSizes,
+ "each combination in allowedCombinations must have the same length as inputArgs";
+
+ list<string> inputArgList = inputArgs;
+ list<list<Type>> allowedCombinationList = allowedCombinations;
+}
+
// Type Constraint operand `idx`'s Element type is `type`.
class TCopVTEtIs<int idx, Type type> : And<[
CPred<"$_op.getNumOperands() > " # idx>,
More information about the Mlir-commits
mailing list