-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[mlir][LLVM][NFC] Avoid rollback in FuncOp --> LLVM lowering #136477
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
[mlir][LLVM][NFC] Avoid rollback in FuncOp --> LLVM lowering #136477
Conversation
This pattern used to create an `llvm.func` op, then check additional requirements and return "failure". This commit moves the checks before the creation of the replacement op, so that no rollback is necessary when one of the checks fails. Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality.
@llvm/pr-subscribers-mlir Author: Matthias Springer (matthias-springer) ChangesThis pattern used to create an Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality. Full diff: https://github.com/llvm/llvm-project/pull/136477.diff 1 Files Affected:
diff --git a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
index 55f0a9ac3bbb2..328c605add65c 100644
--- a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
+++ b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
@@ -320,13 +320,22 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
// overriden with an LLVM pointer type for later processing.
SmallVector<std::optional<NamedAttribute>> byValRefNonPtrAttrs;
TypeConverter::SignatureConversion result(funcOp.getNumArguments());
- auto llvmType = converter.convertFunctionSignature(
- funcOp, varargsAttr && varargsAttr.getValue(),
- shouldUseBarePtrCallConv(funcOp, &converter), result,
- byValRefNonPtrAttrs);
+ auto llvmType = dyn_cast_or_null<LLVM::LLVMFunctionType>(
+ converter.convertFunctionSignature(
+ funcOp, varargsAttr && varargsAttr.getValue(),
+ shouldUseBarePtrCallConv(funcOp, &converter), result,
+ byValRefNonPtrAttrs));
if (!llvmType)
return rewriter.notifyMatchFailure(funcOp, "signature conversion failed");
+ // Check for unsupported variadic functions.
+ if (!shouldUseBarePtrCallConv(funcOp, &converter))
+ if (funcOp->getAttrOfType<UnitAttr>(
+ LLVM::LLVMDialect::getEmitCWrapperAttrName()))
+ if (llvmType.isVarArg())
+ return funcOp.emitError("C interface for variadic functions is not "
+ "supported yet.");
+
// Create an LLVM function, use external linkage by default until MLIR
// functions have linkage.
LLVM::Linkage linkage = LLVM::Linkage::External;
@@ -342,6 +351,18 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
linkage = attr.getLinkage();
}
+ // Check for invalid attributes.
+ StringRef readnoneAttrName = LLVM::LLVMDialect::getReadnoneAttrName();
+ if (funcOp->hasAttr(readnoneAttrName)) {
+ auto attr = funcOp->getAttrOfType<UnitAttr>(readnoneAttrName);
+ if (!attr) {
+ funcOp->emitError() << "Contains " << readnoneAttrName
+ << " attribute not of type UnitAttr";
+ return rewriter.notifyMatchFailure(
+ funcOp, "Contains readnone attribute not of type UnitAttr");
+ }
+ }
+
SmallVector<NamedAttribute, 4> attributes;
filterFuncAttributes(funcOp, attributes);
auto newFuncOp = rewriter.create<LLVM::LLVMFuncOp>(
@@ -352,15 +373,7 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
.setVisibility(funcOp.getVisibility());
// Create a memory effect attribute corresponding to readnone.
- StringRef readnoneAttrName = LLVM::LLVMDialect::getReadnoneAttrName();
if (funcOp->hasAttr(readnoneAttrName)) {
- auto attr = funcOp->getAttrOfType<UnitAttr>(readnoneAttrName);
- if (!attr) {
- funcOp->emitError() << "Contains " << readnoneAttrName
- << " attribute not of type UnitAttr";
- return rewriter.notifyMatchFailure(
- funcOp, "Contains readnone attribute not of type UnitAttr");
- }
auto memoryAttr = LLVM::MemoryEffectsAttr::get(
rewriter.getContext(),
{LLVM::ModRefInfo::NoModRef, LLVM::ModRefInfo::NoModRef,
@@ -447,10 +460,6 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
if (!shouldUseBarePtrCallConv(funcOp, &converter)) {
if (funcOp->getAttrOfType<UnitAttr>(
LLVM::LLVMDialect::getEmitCWrapperAttrName())) {
- if (newFuncOp.isVarArg())
- return funcOp.emitError("C interface for variadic functions is not "
- "supported yet.");
-
if (newFuncOp.isExternal())
wrapExternalFunction(rewriter, funcOp->getLoc(), converter, funcOp,
newFuncOp);
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the cleanup!
LGTM
…6477) This pattern used to create an `llvm.func` op, then check additional requirements and return "failure". This commit moves the checks before the creation of the replacement op, so that no rollback is necessary when one of the checks fails. Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality.
…6477) This pattern used to create an `llvm.func` op, then check additional requirements and return "failure". This commit moves the checks before the creation of the replacement op, so that no rollback is necessary when one of the checks fails. Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality.
…6477) This pattern used to create an `llvm.func` op, then check additional requirements and return "failure". This commit moves the checks before the creation of the replacement op, so that no rollback is necessary when one of the checks fails. Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality.
This pattern used to create an
llvm.func
op, then check additional requirements and return "failure". This commit moves the checks before the creation of the replacement op, so that no rollback is necessary when one of the checks fails.Note: This is in preparation of the One-Shot Dialect Conversion refactoring, which removes the rollback functionality.