[Mlir-commits] [mlir] [mlir][bufferization] Support bufferization of external functions (PR #113999)
Matthias Springer
llvmlistbot at llvm.org
Tue Oct 29 15:16:43 PDT 2024
================
@@ -392,36 +393,45 @@ struct FuncOpInterface
auto funcOp = cast<FuncOp>(op);
FunctionType funcType = funcOp.getFunctionType();
- // Construct the bufferized function type.
+ // Construct the bufferized function type. Compute the argument types.
SmallVector<Type> argTypes;
for (const auto &it : llvm::enumerate(funcType.getInputs())) {
Type argType = it.value();
- if (dyn_cast<TensorType>(argType)) {
+ if (isa<TensorType>(argType)) {
argTypes.push_back(
getBufferizedFunctionArgType(funcOp, it.index(), options));
continue;
}
argTypes.push_back(argType);
}
- // Bodiless functions are assumed opaque and we cannot know the
- // bufferization contract they want to enforce. As a consequence, only
- // support functions that don't return any tensors atm.
- if (funcOp.isExternal()) {
- SmallVector<Type> retTypes;
- for (Type resultType : funcType.getResults()) {
- if (isa<TensorType>(resultType))
- return funcOp->emitError() << "cannot bufferize bodiless function "
- << "that returns a tensor";
+ // Compute the result types.
+ SmallVector<Type> retTypes;
+ for (Type resultType : funcType.getResults()) {
+ if (auto tensorType = dyn_cast<TensorType>(resultType)) {
+ BaseMemRefType resultType = options.functionArgTypeConverterFn(
+ tensorType, *options.defaultMemorySpaceFn(tensorType), funcOp,
+ options);
retTypes.push_back(resultType);
+ continue;
}
- funcOp.setType(FunctionType::get(op->getContext(), argTypes, retTypes));
+ retTypes.push_back(resultType);
+ }
+
+ // Compute the new function type.
+ auto newFuncType = FunctionType::get(op->getContext(), argTypes, retTypes);
+
+ // If the function has no body, set the new function type and we are done.
+ if (funcOp.isExternal()) {
+ funcOp.setType(newFuncType);
return success();
}
// TODO: Support functions with multiple returns.
----------------
matthias-springer wrote:
I'm going to send a separate PR for that: https://github.com/llvm/llvm-project/pull/114017
https://github.com/llvm/llvm-project/pull/113999
More information about the Mlir-commits
mailing list