diff --git a/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp b/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp --- a/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp +++ b/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp @@ -482,11 +482,17 @@ while (!workingSet.empty()) { Value value = workingSet.pop_back_val(); - if (condition(value) || value.isa()) { + if (condition(value)) { result.insert(value); continue; } + if (value.isa()) { + if (alwaysIncludeLeaves) + result.insert(value); + continue; + } + OpResult opResult = value.cast(); BufferizableOpInterface bufferizableOp = options.dynCastBufferizableOp(opResult.getDefiningOp()); diff --git a/mlir/test/Dialect/Bufferization/Transforms/one-shot-bufferize-empty-tensor-elimination.mlir b/mlir/test/Dialect/Bufferization/Transforms/one-shot-bufferize-empty-tensor-elimination.mlir --- a/mlir/test/Dialect/Bufferization/Transforms/one-shot-bufferize-empty-tensor-elimination.mlir +++ b/mlir/test/Dialect/Bufferization/Transforms/one-shot-bufferize-empty-tensor-elimination.mlir @@ -220,4 +220,14 @@ %2 = tensor.insert_slice %1 into %t2[1] [5] [1] : tensor<5xf32> into tensor<10xf32> return %2 : tensor<10xf32> -} \ No newline at end of file +} + +// ----- + +// This is a regression test. Make sure that there is no crash. + +// CHECK-LABEL: func.func @regression_insert_of_bbarg( +func.func @regression_insert_of_bbarg(%t0: tensor<5xf32>, %t1: tensor<10xf32>) -> tensor<10xf32> { + %0 = tensor.insert_slice %t0 into %t1 [2] [5] [1] : tensor<5xf32> into tensor<10xf32> + return %0 : tensor<10xf32> +}