-
Notifications
You must be signed in to change notification settings - Fork 14k
Revert "[mlir][NVVM] Disallow results on kernel functions (#96399)" #97074
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Revert "[mlir][NVVM] Disallow results on kernel functions (#96399)" #97074
Conversation
This reverts commit 346c4a8.
@llvm/pr-subscribers-mlir @llvm/pr-subscribers-mlir-llvm Author: Jeff Niu (Mogball) ChangesNVVM IR itself doesn't place any restriction that a function annotated as Reverts llvm/llvm-project#96399 Full diff: https://github.com/llvm/llvm-project/pull/97074.diff 2 Files Affected:
diff --git a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
index 3d6a911f36541..94197e473ce01 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
@@ -214,8 +214,7 @@ void MmaOp::print(OpAsmPrinter &p) {
p.printOptionalAttrDict(this->getOperation()->getAttrs(), ignoreAttrNames);
// Print the types of the operands and result.
- p << " : "
- << "(";
+ p << " : " << "(";
llvm::interleaveComma(SmallVector<Type, 3>{frags[0].regs[0].getType(),
frags[1].regs[0].getType(),
frags[2].regs[0].getType()},
@@ -956,9 +955,7 @@ std::string NVVM::WgmmaMmaAsyncOp::getPtx() {
ss << "},";
// Need to map read/write registers correctly.
regCnt = (regCnt * 2);
- ss << " $" << (regCnt) << ","
- << " $" << (regCnt + 1) << ","
- << " p";
+ ss << " $" << (regCnt) << "," << " $" << (regCnt + 1) << "," << " p";
if (getTypeD() != WGMMATypes::s32) {
ss << ", $" << (regCnt + 3) << ", $" << (regCnt + 4);
}
@@ -1056,14 +1053,10 @@ LogicalResult NVVMDialect::verifyOperationAttribute(Operation *op,
StringAttr attrName = attr.getName();
// Kernel function attribute should be attached to functions.
if (attrName == NVVMDialect::getKernelFuncAttrName()) {
- auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op);
- if (!funcOp) {
+ if (!isa<LLVM::LLVMFuncOp>(op)) {
return op->emitError() << "'" << NVVMDialect::getKernelFuncAttrName()
<< "' attribute attached to unexpected op";
}
- if (!funcOp.getResultTypes().empty()) {
- return op->emitError() << "kernel function cannot have results";
- }
}
// If maxntid and reqntid exist, it must be an array with max 3 dim
if (attrName == NVVMDialect::getMaxntidAttrName() ||
diff --git a/mlir/test/Target/LLVMIR/nvvmir.mlir b/mlir/test/Target/LLVMIR/nvvmir.mlir
index 26ba80cba6ed5..a8ae4d97888c9 100644
--- a/mlir/test/Target/LLVMIR/nvvmir.mlir
+++ b/mlir/test/Target/LLVMIR/nvvmir.mlir
@@ -574,10 +574,3 @@ llvm.func @kernel_func(%arg0: !llvm.ptr {llvm.byval = i32, nvvm.grid_constant})
llvm.func @kernel_func(%arg0: !llvm.ptr {llvm.byval = i32, nvvm.grid_constant}, %arg1: f32, %arg2: !llvm.ptr {llvm.byval = f32, nvvm.grid_constant}) attributes {nvvm.kernel} {
llvm.return
}
-
-// -----
-
-// expected-error @below{{kernel function cannot have results}}
-llvm.func @kernel_with_result(%i: i32) -> i32 attributes {nvvm.kernel} {
- llvm.return %i : i32
-}
|
Can you please show me an example of a kernel can return a value? So we can agree on that revert :) |
I agree that kernel functions return |
Thanks for the design information. If MLIR doesn’t have a verifier there, somewhere in llvm or ptxas will surely fail. But isn’t that like letting a small leak turn into a flood? I thought MLIR has opportunity to catch issues early and elegantly. |
LLVM and PTXAS happily accept this 🤷 . If they did enforce the invariant, then it would make sense for the LLVMDialect to as well. |
Does the |
Yeah it does. It's part of the NVVM spec. |
This could be seen as LLVM being too lose as well: probably because there is no infrastructure in LLVM to add custom verifier through attributes? |
…" (llvm#97074) NVVM IR itself doesn't place any restriction that a function annotated as `nvvm.kernel` actually has no results, so this is a mismatch at the NVVMDialect level and NVVMIR. The GPU dialect might enforce that kernel functions have no results, but it doesn't make sense to propagate this constraint downstream. Reverts llvm#96399
NVVM IR itself doesn't place any restriction that a function annotated as
nvvm.kernel
actually has no results, so this is a mismatch at the NVVMDialect level and NVVMIR. The GPU dialect might enforce that kernel functions have no results, but it doesn't make sense to propagate this constraint downstream.Reverts #96399