Skip to content

Commit 0a33861

Browse files
committed
address comments
1 parent c8376db commit 0a33861

File tree

6 files changed

+96
-49
lines changed

6 files changed

+96
-49
lines changed

mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ def NVVM_ClusterDimZOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.ncluster
214214
//===----------------------------------------------------------------------===//
215215
// CTA index and range within Cluster
216216
def NVVM_BlockInClusterIdXOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctaid.x", [NVVMRequiresSM<90>]>;
217-
def NVVM_BlockInClusterIdYOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctaid.y">;
218-
def NVVM_BlockInClusterIdZOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctaid.z">;
219-
def NVVM_ClusterDimBlocksXOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctaid.x">;
220-
def NVVM_ClusterDimBlocksYOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctaid.y">;
217+
def NVVM_BlockInClusterIdYOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctaid.y", [NVVMRequiresSM<90>]>;
218+
def NVVM_BlockInClusterIdZOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctaid.z", [NVVMRequiresSM<90>]>;
219+
def NVVM_ClusterDimBlocksXOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctaid.x", [NVVMRequiresSM<90>]>;
220+
def NVVM_ClusterDimBlocksYOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctaid.y", [NVVMRequiresSM<90>]>;
221221
def NVVM_ClusterDimBlocksZOp : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctaid.z">;
222222

223223
//===----------------------------------------------------------------------===//
224224
// CTA index and across Cluster dimensions
225-
def NVVM_ClusterId : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctarank">;
225+
def NVVM_ClusterId : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.ctarank", [NVVMRequiresSM<90>]>;
226226
def NVVM_ClusterDim : NVVM_SpecialRangeableRegisterOp<"read.ptx.sreg.cluster.nctarank">;
227227

228228
//===----------------------------------------------------------------------===//
@@ -323,7 +323,7 @@ def NVVM_MBarrierInitOp : NVVM_PTXBuilder_Op<"mbarrier.init">,
323323
}
324324

325325
/// mbarrier.init instruction with shared pointer type
326-
def NVVM_MBarrierInitSharedOp : NVVM_PTXBuilder_Op<"mbarrier.init.shared">,
326+
def NVVM_MBarrierInitSharedOp : NVVM_PTXBuilder_Op<"mbarrier.init.shared", [NVVMRequiresSM<80>, DeclareOpInterfaceMethods<BasicPtxBuilderOpInterface>]>,
327327
Arguments<(ins LLVM_PointerShared:$addr, I32:$count, PtxPredicate:$predicate)> {
328328
string llvmBuilder = [{
329329
createIntrinsicCall(builder, llvm::Intrinsic::nvvm_mbarrier_init_shared, {$addr, $count});
@@ -545,7 +545,7 @@ def NVVM_ClusterArriveOp : NVVM_Op<"cluster.arrive"> {
545545
let assemblyFormat = "attr-dict";
546546
}
547547

548-
def NVVM_ClusterArriveRelaxedOp : NVVM_Op<"cluster.arrive.relaxed"> {
548+
def NVVM_ClusterArriveRelaxedOp : NVVM_Op<"cluster.arrive.relaxed", [NVVMRequiresSM<90>]> {
549549
let arguments = (ins OptionalAttr<UnitAttr>:$aligned);
550550

551551
let summary = "Cluster Barrier Relaxed Arrive Op";
@@ -571,7 +571,7 @@ def NVVM_ClusterArriveRelaxedOp : NVVM_Op<"cluster.arrive.relaxed"> {
571571
let assemblyFormat = "attr-dict";
572572
}
573573

574-
def NVVM_ClusterWaitOp : NVVM_Op<"cluster.wait"> {
574+
def NVVM_ClusterWaitOp : NVVM_Op<"cluster.wait", [NVVMRequiresSM<90>]> {
575575
let arguments = (ins OptionalAttr<UnitAttr>:$aligned);
576576

577577
let summary = "Cluster Barrier Wait Op";
@@ -776,7 +776,7 @@ def ShflKind : I32EnumAttr<"ShflKind", "NVVM shuffle kind",
776776
def ShflKindAttr : EnumAttr<NVVM_Dialect, ShflKind, "shfl_kind">;
777777

778778
def NVVM_ShflOp :
779-
NVVM_Op<"shfl.sync">,
779+
NVVM_Op<"shfl.sync", [NVVMRequiresSM<30>]>,
780780
Results<(outs LLVM_Type:$res)>,
781781
Arguments<(ins I32:$thread_mask,
782782
LLVM_Type:$val,
@@ -1880,7 +1880,7 @@ def NVVM_CpAsyncBulkCommitGroupOp : NVVM_Op<"cp.async.bulk.commit.group">,
18801880
}];
18811881
}
18821882

1883-
def NVVM_CpAsyncBulkWaitGroupOp : NVVM_Op<"cp.async.bulk.wait_group">,
1883+
def NVVM_CpAsyncBulkWaitGroupOp : NVVM_Op<"cp.async.bulk.wait_group", [NVVMRequiresSM<90>]>,
18841884
Arguments<(ins
18851885
ConfinedAttr<I32Attr, [IntMinValue<0>]>:$group,
18861886
OptionalAttr<UnitAttr>:$read)> {
@@ -1910,7 +1910,7 @@ def NVVM_CpAsyncBulkWaitGroupOp : NVVM_Op<"cp.async.bulk.wait_group">,
19101910
def NVVM_CpAsyncBulkTensorGlobalToSharedClusterOp :
19111911
NVVM_Op<"cp.async.bulk.tensor.shared.cluster.global",
19121912
[DeclareOpInterfaceMethods<BasicPtxBuilderOpInterface>,
1913-
AttrSizedOperandSegments]>,
1913+
AttrSizedOperandSegments, NVVMRequiresSM<90>]>,
19141914
Arguments<(ins LLVM_PointerShared:$dstMem,
19151915
LLVM_AnyPointer:$tmaDescriptor,
19161916
Variadic<I32>:$coordinates,
@@ -2347,8 +2347,7 @@ def NVVM_CpAsyncBulkSharedCTAToGlobalOp :
23472347
// NVVM Wgmma Ops
23482348
//===----------------------------------------------------------------------===//
23492349

2350-
def NVVM_WgmmaFenceAlignedOp : NVVM_Op<"wgmma.fence.aligned",
2351-
[NVVMRequiresSM<90, /*ArchAccelerated*/"true">]> {
2350+
def NVVM_WgmmaFenceAlignedOp : NVVM_Op<"wgmma.fence.aligned", [NVVMRequiresSM90a]> {
23522351
let arguments = (ins);
23532352
let description = [{
23542353
Enforce an ordering of register accesses between warpgroup level matrix
@@ -2362,8 +2361,7 @@ def NVVM_WgmmaFenceAlignedOp : NVVM_Op<"wgmma.fence.aligned",
23622361
}];
23632362
}
23642363

2365-
def NVVM_WgmmaGroupSyncAlignedOp : NVVM_Op<"wgmma.commit.group.sync.aligned",
2366-
[NVVMRequiresSM<90, /*ArchAccelerated*/"true">]> {
2364+
def NVVM_WgmmaGroupSyncAlignedOp : NVVM_Op<"wgmma.commit.group.sync.aligned", [NVVMRequiresSM90a]> {
23672365
let assemblyFormat = "attr-dict";
23682366
let description = [{
23692367
Commits all prior uncommitted warpgroup level matrix multiplication operations.
@@ -2375,7 +2373,7 @@ def NVVM_WgmmaGroupSyncAlignedOp : NVVM_Op<"wgmma.commit.group.sync.aligned",
23752373
}];
23762374
}
23772375

2378-
def NVVM_WgmmaWaitGroupSyncOp : NVVM_Op<"wgmma.wait.group.sync.aligned">{
2376+
def NVVM_WgmmaWaitGroupSyncOp : NVVM_Op<"wgmma.wait.group.sync.aligned", [NVVMRequiresSM90a]> {
23792377
let arguments = (ins I64Attr:$group);
23802378
let assemblyFormat = "attr-dict $group";
23812379
let description = [{
@@ -2571,7 +2569,7 @@ def NVVM_GriddepcontrolLaunchDependentsOp
25712569

25722570
def NVVM_MapaOp: NVVM_Op<"mapa",
25732571
[TypesMatchWith<"`res` and `a` should have the same type",
2574-
"a", "res", "$_self">]> {
2572+
"a", "res", "$_self">, NVVMRequiresSM<90>]> {
25752573
let results = (outs AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$res);
25762574
let arguments = (ins AnyTypeOf<[LLVM_PointerGeneric, LLVM_PointerShared]>:$a, I32:$b);
25772575

@@ -2662,7 +2660,7 @@ def Tcgen05WaitKindAttr :
26622660
let assemblyFormat = "`<` $value `>`";
26632661
}
26642662

2665-
def NVVM_Tcgen05AllocOp : NVVM_Op<"tcgen05.alloc"> {
2663+
def NVVM_Tcgen05AllocOp : NVVM_Op<"tcgen05.alloc", [NVVMRequiresSM<100, "true", "false">]> {
26662664
let summary = "Tcgen05 alloc operation";
26672665
let description = [{
26682666
The `tcgen05.alloc` Op allocates tensor core memory for
@@ -2692,7 +2690,7 @@ def NVVM_Tcgen05AllocOp : NVVM_Op<"tcgen05.alloc"> {
26922690
}];
26932691
}
26942692

2695-
def NVVM_Tcgen05DeallocOp : NVVM_Op<"tcgen05.dealloc"> {
2693+
def NVVM_Tcgen05DeallocOp : NVVM_Op<"tcgen05.dealloc", [NVVMRequiresSM<100, "true", "false">]> {
26962694
let summary = "Tcgen05 dealloc operation";
26972695
let description = [{
26982696
The `tcgen05.dealloc` Op de-allocates the tensor core memory
@@ -2720,7 +2718,7 @@ def NVVM_Tcgen05DeallocOp : NVVM_Op<"tcgen05.dealloc"> {
27202718
}];
27212719
}
27222720

2723-
def NVVM_Tcgen05RelinquishAllocPermitOp : NVVM_Op<"tcgen05.relinquish_alloc_permit"> {
2721+
def NVVM_Tcgen05RelinquishAllocPermitOp : NVVM_Op<"tcgen05.relinquish_alloc_permit", [NVVMRequiresSM<100, "true", "false">]> {
27242722
let summary = "Tcgen05 Op to relinquish the right to allocate";
27252723
let description = [{
27262724
The `tcgen05.relinquish_alloc_permit` Op specifies that the CTA
@@ -2743,7 +2741,7 @@ def NVVM_Tcgen05RelinquishAllocPermitOp : NVVM_Op<"tcgen05.relinquish_alloc_perm
27432741
}];
27442742
}
27452743

2746-
def NVVM_Tcgen05FenceOp : NVVM_Op<"tcgen05.fence"> {
2744+
def NVVM_Tcgen05FenceOp : NVVM_Op<"tcgen05.fence", [NVVMRequiresSM<100, "true", "false">]> {
27472745
let summary = "Tcgen05 fence operations";
27482746
let description = [{
27492747
The `tcgen05.fence<before>` orders all prior async tcgen05 operations
@@ -2765,7 +2763,7 @@ def NVVM_Tcgen05FenceOp : NVVM_Op<"tcgen05.fence"> {
27652763
}];
27662764
}
27672765

2768-
def NVVM_Tcgen05WaitOp : NVVM_Op<"tcgen05.wait"> {
2766+
def NVVM_Tcgen05WaitOp : NVVM_Op<"tcgen05.wait", [NVVMRequiresSM<100, "true", "false">]> {
27692767
let summary = "Tcgen05 wait operations";
27702768
let description = [{
27712769
The `tcgen05.wait<load>` causes the executing thread to block until
@@ -2787,7 +2785,7 @@ def NVVM_Tcgen05WaitOp : NVVM_Op<"tcgen05.wait"> {
27872785
}];
27882786
}
27892787

2790-
def NVVM_Tcgen05CommitOp : NVVM_Op<"tcgen05.commit"> {
2788+
def NVVM_Tcgen05CommitOp : NVVM_Op<"tcgen05.commit", [NVVMRequiresSM<100, "true", "false">]> {
27912789
let summary = "Tcgen05 commit operations";
27922790
let description = [{
27932791
The `tcgen05.commit` makes the mbarrier object, specified by
@@ -2825,7 +2823,7 @@ def NVVM_Tcgen05CommitOp : NVVM_Op<"tcgen05.commit"> {
28252823
}];
28262824
}
28272825

2828-
def NVVM_Tcgen05ShiftOp : NVVM_Op<"tcgen05.shift"> {
2826+
def NVVM_Tcgen05ShiftOp : NVVM_Op<"tcgen05.shift", [NVVMRequiresSM<100, "true", "false">]> {
28292827
let summary = "Tcgen05 shift operation";
28302828
let description = [{
28312829
The `tcgen05.shift` is an asynchronous instruction which initiates
@@ -2891,7 +2889,7 @@ def Tcgen05CpSrcFormatAttr : EnumAttr<NVVM_Dialect, Tcgen05CpSrcFormat, "tcgen05
28912889
let assemblyFormat = "`<` $value `>`";
28922890
}
28932891

2894-
def NVVM_Tcgen05CpOp : NVVM_Op<"tcgen05.cp"> {
2892+
def NVVM_Tcgen05CpOp : NVVM_Op<"tcgen05.cp", [NVVMRequiresSM<100, "true", "false">]> {
28952893
let summary = "Tcgen05 copy operation";
28962894
let description = [{
28972895
Instruction tcgen05.cp initiates an asynchronous copy operation from
@@ -2961,7 +2959,7 @@ def Tcgen05LdStShapeAttr: EnumAttr<NVVM_Dialect, Tcgen05LdStShape, "tcgen05_ldst
29612959
// NVVM tcgen05.ld Op
29622960
//===----------------------------------------------------------------------===//
29632961

2964-
def NVVM_Tcgen05LdOp : NVVM_Op<"tcgen05.ld"> {
2962+
def NVVM_Tcgen05LdOp : NVVM_Op<"tcgen05.ld", [NVVMRequiresSM<100, "true", "false">]> {
29652963
let summary = "tensor memory load instructions";
29662964
let arguments = (ins
29672965
// Attributes
@@ -3051,7 +3049,7 @@ def NVVM_Tcgen05LdOp : NVVM_Op<"tcgen05.ld"> {
30513049
// NVVM tcgen05.st Op
30523050
//===----------------------------------------------------------------------===//
30533051

3054-
def NVVM_Tcgen05StOp : NVVM_Op<"tcgen05.st"> {
3052+
def NVVM_Tcgen05StOp : NVVM_Op<"tcgen05.st", [NVVMRequiresSM<100, "true", "false">]> {
30553053
let summary = "tensor memory store instructions";
30563054
let arguments = (ins
30573055
// Attributes

mlir/include/mlir/Dialect/LLVMIR/NVVMTraits.h

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,21 @@ namespace mlir {
2121

2222
namespace NVVM {
2323

24+
// Structure to store and check compatibility of SM versions.
2425
struct NVVMCheckSMVersion {
2526
int archVersion;
2627
bool archAccelerated;
28+
bool exactMatch;
2729

28-
NVVMCheckSMVersion() {}
29-
NVVMCheckSMVersion(StringRef smVersion) { parse(smVersion); }
30-
NVVMCheckSMVersion(int archVersion, bool archAccelerated)
31-
: archVersion(archVersion), archAccelerated(archAccelerated) {}
30+
NVVMCheckSMVersion()
31+
: archVersion(0), archAccelerated(false), exactMatch(false) {}
32+
NVVMCheckSMVersion(StringRef smVersion, bool exactMatch = false)
33+
: exactMatch(exactMatch) {
34+
parse(smVersion);
35+
}
36+
NVVMCheckSMVersion(int archVersion, bool archAccelerated, bool exactMatch)
37+
: archVersion(archVersion), archAccelerated(archAccelerated),
38+
exactMatch(exactMatch) {}
3239

3340
// Parses the SM version string and sets the archVersion (integer) and
3441
// the archAccelerated flag.
@@ -40,11 +47,12 @@ struct NVVMCheckSMVersion {
4047
}
4148

4249
bool isCompatible(const NVVMCheckSMVersion &targetSM) const {
43-
// for arch-conditional SMs, they should exactly match to be valid
44-
if (archAccelerated || targetSM.archAccelerated)
50+
if (exactMatch)
4551
return (*this) == targetSM;
46-
47-
return archVersion <= targetSM.archVersion;
52+
53+
return archAccelerated ?
54+
archVersion <= targetSM.archVersion && targetSM.archAccelerated :
55+
archVersion <= targetSM.archVersion;
4856
}
4957

5058
bool operator==(const NVVMCheckSMVersion &other) const {
@@ -61,16 +69,18 @@ namespace mlir {
6169

6270
namespace OpTrait {
6371

64-
template <int Version, bool ArchAccelerated = false>
72+
template <int MinVersion, bool ArchAccelerated = false, bool ExactMatch = false>
6573
class NVVMRequiresSM {
6674
public:
6775
template <typename ConcreteOp>
68-
class Impl : public OpTrait::TraitBase<
69-
ConcreteOp, NVVMRequiresSM<Version, ArchAccelerated>::Impl>,
70-
public mlir::NVVM::RequiresSMInterface::Trait<ConcreteOp> {
76+
class Impl
77+
: public OpTrait::TraitBase<
78+
ConcreteOp,
79+
NVVMRequiresSM<MinVersion, ArchAccelerated, ExactMatch>::Impl>,
80+
public mlir::NVVM::RequiresSMInterface::Trait<ConcreteOp> {
7181
public:
7282
const NVVM::NVVMCheckSMVersion getRequiredMinSMVersion() const {
73-
return NVVM::NVVMCheckSMVersion(Version, ArchAccelerated);
83+
return NVVM::NVVMCheckSMVersion(MinVersion, ArchAccelerated, ExactMatch);
7484
}
7585
};
7686
};

mlir/include/mlir/Dialect/LLVMIR/NVVMTraits.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ def RequiresSMInterface: OpInterface<"RequiresSMInterface"> {
2727
];
2828
}
2929

30-
class NVVMRequiresSM<int Version, string ArchAccelerated = "false"> :
30+
class NVVMRequiresSM<int minVersion, string isArchAccelerated = "false",
31+
string exactMatch = "false"> :
3132
ParamNativeOpTrait<"NVVMRequiresSM",
32-
!cast<string>(Version) # "," # ArchAccelerated>;
33+
!cast<string>(minVersion) # "," # isArchAccelerated # ","
34+
# exactMatch>;
35+
36+
def NVVMRequiresSM90a : NVVMRequiresSM<90, "true", "true">;
3337

3438
#endif //NVVM_TRAITS

mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1567,8 +1567,12 @@ LogicalResult NVVMTargetAttr::verifyTarget(Operation *gpuModule) {
15671567
if (!gpuModuleOp)
15681568
return emitError(gpuModule->getLoc(),
15691569
"NVVM target attribute must be attached to a GPU module");
1570-
1570+
15711571
NVVMCheckSMVersion targetSMVersion(getChip());
1572+
if (targetSMVersion.archVersion < 20)
1573+
return emitError(gpuModule->getLoc(),
1574+
"Minimum NVVM target SM version is sm_20");
1575+
15721576
gpuModuleOp->walk([&](Operation *op) {
15731577
if (auto reqOp = llvm::dyn_cast<NVVM::RequiresSMInterface>(op)) {
15741578
NVVMCheckSMVersion requirement = reqOp.getRequiredMinSMVersion();

mlir/test/Dialect/LLVMIR/nvvm-check-targetSM.mlir

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,19 @@ gpu.module @check_valid_SM_greater_2 [#nvvm.target<chip = "sm_90">] {
1313
test.nvvm_requires_sm_80
1414
}
1515

16-
gpu.module @check_valid_SM_arch_acc [#nvvm.target<chip = "sm_90a">] {
16+
gpu.module @check_valid_SM_arch_acc_exact_1 [#nvvm.target<chip = "sm_90a">] {
1717
test.nvvm_requires_sm_90a
1818
}
1919

20+
gpu.module @check_valid_SM_arch_acc_atleast_1 [#nvvm.target<chip = "sm_90a">] {
21+
test.nvvm_requires_sm_atleast_90_aa
22+
}
23+
24+
gpu.module @check_valid_SM_arch_acc_atleast_2 [#nvvm.target<chip = "sm_100a">] {
25+
test.nvvm_requires_sm_atleast_90_aa
26+
}
27+
28+
2029
gpu.module @disable_verify_target1 [#nvvm.target<chip = "sm_90", verifyTarget = false>] {
2130
test.nvvm_requires_sm_90a
2231
}
@@ -25,7 +34,9 @@ gpu.module @disable_verify_target2 [#nvvm.target<chip = "sm_70", verifyTarget =
2534
test.nvvm_requires_sm_80
2635
}
2736

28-
37+
gpu.module @disable_verify_target3 [#nvvm.target<chip = "sm_90", verifyTarget = false>] {
38+
test.nvvm_requires_sm_atleast_90_aa
39+
}
2940

3041
// -----
3142

@@ -43,14 +54,28 @@ gpu.module @check_invalid_SM_lesser_2 [#nvvm.target<chip = "sm_75">] {
4354

4455
// -----
4556

46-
gpu.module @check_invalid_SM_arch_acc_1 [#nvvm.target<chip = "sm_90">] {
57+
gpu.module @check_invalid_SM_arch_acc_exact_1 [#nvvm.target<chip = "sm_90">] {
4758
// expected-error @below {{is not supported on sm_90}}
4859
test.nvvm_requires_sm_90a
4960
}
5061

5162
// -----
5263

53-
gpu.module @check_invalid_SM_arch_acc_2 [#nvvm.target<chip = "sm_80">] {
64+
gpu.module @check_invalid_SM_arch_acc_exact_2 [#nvvm.target<chip = "sm_80">] {
5465
// expected-error @below {{is not supported on sm_80}}
5566
test.nvvm_requires_sm_90a
5667
}
68+
69+
// -----
70+
71+
gpu.module @check_invalid_SM_arch_acc_atleast_1 [#nvvm.target<chip = "sm_80">] {
72+
// expected-error @below {{is not supported on sm_80}}
73+
test.nvvm_requires_sm_atleast_90_aa
74+
}
75+
76+
// -----
77+
78+
gpu.module @check_invalid_SM_arch_acc_atleast_2 [#nvvm.target<chip = "sm_90">] {
79+
// expected-error @below {{is not supported on sm_90}}
80+
test.nvvm_requires_sm_atleast_90_aa
81+
}

mlir/test/lib/Dialect/Test/TestOps.td

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,8 +2739,14 @@ def TestNVVMRequiresSMOp : TEST_Op<"nvvm_requires_sm_80",
27392739
let assemblyFormat = "attr-dict";
27402740
}
27412741

2742-
def TestNVVMRequiresSMArchCondOp : TEST_Op<"nvvm_requires_sm_90a",
2743-
[NVVMRequiresSM<90, "true">]> {
2742+
def TestNVVMRequiresAtleastSMArchCondOp :
2743+
TEST_Op<"nvvm_requires_sm_atleast_90_aa", [NVVMRequiresSM<90, "true">]> {
2744+
let arguments = (ins );
2745+
let assemblyFormat = "attr-dict";
2746+
}
2747+
2748+
def TestNVVMRequiresExactSMArchCondOp : TEST_Op<"nvvm_requires_sm_90a",
2749+
[NVVMRequiresSM90a]> {
27442750
let arguments = (ins );
27452751
let assemblyFormat = "attr-dict";
27462752
}

0 commit comments

Comments
 (0)