diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp --- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp +++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp @@ -1033,14 +1033,13 @@ // Now analyzing function. moduleState.startFunctionAnalysis(funcOp); + // Gather equivalence info for CallOps. + equivalenceAnalysis(funcOp, aliasInfo, moduleState); + // Analyze funcOp. if (failed(analyzeOp(funcOp, analysisState))) return failure(); - // Gather equivalence info for CallOps. - // TODO: Make this a post-analysis step. - equivalenceAnalysis(funcOp, aliasInfo, moduleState); - // Mark op as fully analyzed. moduleState.analyzedFuncOps[funcOp] = FuncOpAnalysisState::Analyzed; @@ -1052,23 +1051,21 @@ if (options.testAnalysisOnly) return success(); - // Bufferize function bodies. + // Bufferize functions. for (FuncOp funcOp : moduleState.orderedFuncOps) { // No body => no analysis. - if (funcOp.getBody().empty()) - continue; - - if (failed(bufferizeOp(funcOp, bufferizationState))) - return failure(); - } + if (!funcOp.getBody().empty()) + if (failed(bufferizeOp(funcOp, bufferizationState))) + return failure(); - // Bufferize function boundaries. - for (FuncOp funcOp : moduleState.orderedFuncOps) { // Note: It would be good to apply cleanups here but we cannot as aliasInfo // would be invalidated. if (failed(bufferizeFuncOpBoundary(funcOp, rewriter, bufferizationState))) return failure(); + } + // Check result. + for (FuncOp funcOp : moduleState.orderedFuncOps) { if (!options.allowReturnAllocs && llvm::any_of(funcOp.getFunctionType().getResults(), [](Type t) { return t.isa(); diff --git a/mlir/test/Dialect/Linalg/comprehensive-module-bufferize-invalid.mlir b/mlir/test/Dialect/Linalg/comprehensive-module-bufferize-invalid.mlir --- a/mlir/test/Dialect/Linalg/comprehensive-module-bufferize-invalid.mlir +++ b/mlir/test/Dialect/Linalg/comprehensive-module-bufferize-invalid.mlir @@ -212,11 +212,10 @@ // ----- +// expected-error @+1 {{cannot bufferize bodiless function that returns a tensor}} func private @foo(%t : tensor) -> (f32, tensor, f32) func @call_to_unknown_tensor_returning_func(%t : tensor) { - // expected-error @+2 {{call to FuncOp that returns non-equivalent tensors not supported}} - // expected-error @+1 {{op was not bufferized}} call @foo(%t) : (tensor) -> (f32, tensor, f32) return }