<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/150441>150441</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
One shot bufferization on call op segfaults when bufferizing function boundaries for a callee with tensor arguments and forcing copy before write
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
paul0403
</td>
</tr>
</table>
<pre>
The llvm version I am using is commit `f8cb7987c64dcffb72414a40560055cb717dbf74` https://github.com/llvm/llvm-project/commit/f8cb7987c64dcffb72414a40560055cb717dbf74
The following fails
```mlir
// RUN: mlir-opt --pass-pipeline=
// "builtin.module(one-shot-bufferize{
// bufferize-function-boundaries
// function-boundary-type-conversion=identity-layout-map
// copy-before-write})" %s
func.func public @main(%arg0: tensor<2xf64>) -> f64 {
%0 = call @my_four(%arg0) : (tensor<2xf64>) -> f64
return %0 : f64
}
func.func public @my_four(%arg0: tensor<2xf64>) -> f64 {
%four = arith.constant 4.2 : f64
return %four : f64
}
```
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt "--pass-pipeline=builtin.module(one-shot-bufferize{bufferize-function-boundaries function-boundary-type-conversion=identity-layout-map copy-before-write})" ./multiple_qnodes/3_QuantumCompilationPass.mlir
#0 0x00005e5cef4d58a7 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x37188a7)
#1 0x00005e5cef4d34f5 llvm::sys::RunSignalHandlers() (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x37164f5)
#2 0x00005e5cef4d60d5 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x0000753708642520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00005e5cefaadfe0 mlir::bufferization::func_ext::FuncAnalysisState* mlir::bufferization::OneShotAnalysisState::getExtension<mlir::bufferization::func_ext::FuncAnalysisState>() FuncBufferizableOpInterfaceImpl.cpp:0:0
#5 0x00005e5cefaadc83 mlir::bufferization::func_ext::getCalledFunction(mlir::CallOpInterface, mlir::bufferization::AnalysisState const&) FuncBufferizableOpInterfaceImpl.cpp:0:0
#6 0x00005e5cefaae11a mlir::bufferization::func_ext::CallOpInterface::bufferizesToMemoryWrite(mlir::Operation*, mlir::OpOperand&, mlir::bufferization::AnalysisState const&) const FuncBufferizableOpInterfaceImpl.cpp:0:0
#7 0x00005e5cefa3d531 mlir::bufferization::AnalysisState::isInPlace(mlir::OpOperand&) const (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3c80531)
#8 0x00005e5cefa3ac82 mlir::bufferization::BufferizableOpInterface::resolveTensorOpOperandConflicts(mlir::RewriterBase&, mlir::bufferization::AnalysisState const&, mlir::bufferization::BufferizationState const&) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3c7dc82)
#9 0x00005e5cefaaef01 mlir::bufferization::detail::BufferizableOpInterfaceInterfaceTraits::ExternalModel<mlir::bufferization::func_ext::CallOpInterface, mlir::func::CallOp>::resolveConflicts(mlir::Operation*, mlir::RewriterBase&, mlir::bufferization::AnalysisState const&, mlir::bufferization::BufferizationState const&) const (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3cf1f01)
#10 0x00005e5cefad72c8 mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<mlir::bufferization::insertTensorCopies(mlir::Operation*, mlir::bufferization::AnalysisState const&, mlir::bufferization::BufferizationState const&)::$_1>(long, mlir::Operation*) TensorCopyInsertion.cpp:0:0
#11 0x00005e5cef580f87 mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x37c3f87)
#12 0x00005e5cefad717a mlir::bufferization::insertTensorCopies(mlir::Operation*, mlir::bufferization::AnalysisState const&, mlir::bufferization::BufferizationState const&) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3d1a17a)
#13 0x00005e5cefa8e8db mlir::bufferization::bufferizeOp(mlir::Operation*, mlir::bufferization::BufferizationOptions const&, mlir::bufferization::BufferizationState&, mlir::bufferization::BufferizationStatistics*) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3cd18db)
#14 0x00005e5cefac88b8 mlir::bufferization::bufferizeModuleOp(mlir::ModuleOp, mlir::bufferization::OneShotBufferizationOptions const&, mlir::bufferization::BufferizationState&, mlir::bufferization::BufferizationStatistics*) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3d0b8b8)
#15 0x00005e5cefac9720 mlir::bufferization::runOneShotModuleBufferize(mlir::ModuleOp, mlir::bufferization::OneShotBufferizationOptions const&, mlir::bufferization::BufferizationState&, mlir::bufferization::BufferizationStatistics*) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3d0c720)
#16 0x00005e5cefa92bc4 (anonymous namespace)::OneShotBufferizePass::runOnOperation() Bufferize.cpp:0:0
#17 0x00005e5cf2f1f755 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7162755)
#18 0x00005e5cf2f202a1 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x71632a1)
#19 0x00005e5cf2f22a6b mlir::PassManager::run(mlir::Operation*) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7165a6b)
#20 0x00005e5cf2f19dd1 performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) MlirOptMain.cpp:0:0
#21 0x00005e5cf2f19a24 llvm::LogicalResult llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) MlirOptMain.cpp:0:0
#22 0x00005e5cf2fd6bb5 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7219bb5)
#23 0x00005e5cf2f12b01 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7155b01)
#24 0x00005e5cf2f12db8 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7155db8)
#25 0x00005e5cf2f12fd2 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x7155fd2)
#26 0x00005e5cef421dc3 main (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3664dc3)
#27 0x0000753708629d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#28 0x0000753708629e40 call_init ./csu/../csu/libc-start.c:128:20
#29 0x0000753708629e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#30 0x00005e5cef421865 _start (/home/paul.wang/catalyst_new/catalyst/frontend/catalyst/utils/../../../mlir/llvm-project/build/bin/mlir-opt+0x3664865)
Segmentation fault (core dumped)
```
The logs led me to https://github.com/llvm/llvm-project/pull/138125, which I believe updated `mlir::bufferization::func_ext::getCalledFunction(mlir::CallOpInterface, mlir::bufferization::AnalysisState const&) ` responsible for the segfault.
--------------------------------------------------------------------
Any one of the following will make the segfault go away:
1. Making the callee argument not a `tensor`, or removing the argument altogether. (Of course, without tensors there's nothing to bufferize)
2. Turning off `copy-before-write`, i.e.
```
mlir-opt --pass-pipeline="builtin.module(one-shot-bufferize{
bufferize-function-boundaries
function-boundary-type-conversion=identity-layout-map })" test.mlir
```
This produces the correct results:
```mlir
module {
func.func public @main(%arg0: memref<2xf64>) -> f64 {
%0 = call @my_four(%arg0) : (memref<2xf64>) -> f64
return %0 : f64
}
func.func public @my_four(%arg0: memref<2xf64>) -> f64 {
%cst = arith.constant 4.200000e+00 : f64
return %cst : f64
}
}
```
Unfortunately for my purposes this is not an option, since I am doing something with asynchronous execution so I have to make conservative buffer decisions.
3. Do not bufferize function boundaries, i.e.
```
mlir-opt --pass-pipeline="builtin.module(one-shot-bufferize{
copy-before-write })" test.mlir
```
```mlir
module {
func.func public @main(%arg0: tensor<2xf64>) -> f64 {
%0 = call @my_four(%arg0) : (tensor<2xf64>) -> f64
return %0 : f64
}
func.func public @my_four(%arg0: tensor<2xf64>) -> f64 {
%cst = arith.constant 4.200000e+00 : f64
return %cst : f64
}
}
```
But this essentially amounts to giving up, instead of solving the problem.
*. As a special note, if we don't set identity layout map and still force copy before write, the pass hangs indefinitely:
```
mlir-opt --pass-pipeline="builtin.module(one-shot-bufferize{
bufferize-function-boundaries
copy-before-write })" test.mlir
```
```
// Nothing happens, hangs indefinitely
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsW1lz47aT_zT0C0oqEjz14AfZHte6Ko6940nlUQUCTQk7IMAAoG3tp98CqIOkbPmYSaLsP6mMLRFX969vuEmM4UsJcB6kF0F6dUZau1L6vCGtCJMwPisVW59_WwES4rFGj6ANVxLdIFKj1nC5RNwgquqaWxRkYVXQMp8VOc0SRquqzHESJSQJ0ywM05SWeZSzssqTIAvRytrGBPE8wNcBvl5yu2rLKVV1gK_dWZtfk0ar_wFqA3zdHRPg63efEs6DcO6Ir5QQ6smRWxEujBvIwu7_WnAdhHOEOjrQ199-DeI5co8nqrFoMmmIMZOGNyC4hCC-6s8OMC5bLiyX01qxVkCACyVhYlbKTsq2qkDz_4Ugv-gv2j2fVK2klis5KVUrGdEcDEL9qeMJ64ldNzChSm5EEcRXnIG03K4ngqxVayc1aYabUNWsJyVUSsPkSXMLQX4V4FmAMQpwavxUd9DU_UBNWwpOUZCENeEywEWAU6KXoUPFgjRKB_Elfq6yJIi_BHiGJkH8BVVZgrZsuoPTEAXxFaJECL_VelGpVvd2wzPkdgxwcXTTzYYabKvldt_5bsRx8ir5B2d-jAO32DNBNLerKVXSWCItSqZ4QEOfus2aMYE7betUsv_1_pcv84cvyLSlsyGCynaJNDRKW2TVx42EG9OCcVInkiEuqWgZILsCRDUxK1QS-t1qQmEahPMHS-h3xNq6cUeE83AahLN7rZaa1IjoZVuDtKYT0_VK1RDga-cZpk9ELp1FEkvE2tiFhKfeV2eiWkkLkg2fttYZH76eTgc_vAkecOLsyq0vnRJe7-wxwPjQJN9ng8ft7tOmdsS8PHetsLwRsPhDKuZFEy_-uyXStvWlqhsuiDv1nhgz3fqiAMchCp_DMAxTSClUCUsLknsf7CQVz83adB_uNZfWy_Gbk2qAi_0kTZ4WylgNpA5wFuBLxKX1hudM4kQEGuCL8DnOo6IguUOtYz8asR8nVfoS-19b-cCXkoj_IpIJ0MazdpocZkmV7jnEIw6zkKVowEuACy-vS2T4kstKLWyA5-77o-LMf5xtVpgpbZwNh_5fd0C8OSBP4zwssgSnONzgIngZ4OvnIltkyURw2T5PlrLtBujUqGnmafZL9hQnA4oJYRWEPk52othal1fn7pEzqQU82-7bdSvpXDpguXmwxEKA58fX30l4WCk7XORHlmC_PDtf7ude_hAVLgZ4pXFDF9v1pYC75kZa0BWhcFM34gWM0zEktIg_AskS7CURAtj1xvkEuNgvd0M9Gpzkj-49YAv5eOXt_jOcZSPOIIrIRzgb0z5YBeabuoVa6fXv3l_2mb5rQHe7drreH_FjzkKzH8DCf_4EIvkQkZilcfQBGrpH3NzIe9E56tc425J4ej6MFmEaR3uPUIwgIbTAxyF5BfJNvAKjxCN88ynaDpNLJSvBqTUDyL6CD7X6ghj4EX14Y9lF_9GhLp2giHJGC7wX0Wxsx1X4htYysISLo-LaffimCbebUOz8sZZE3CoG4mM--aijc1P705y_7qvLy_rxuhs5Dc05WROvoircmLjLw4Z5KGE5pkWP8d-J-P4VTCtsLzvbZtILDdVAEXqzjwhrtpOwqx5dwbKo3gzyXBrQtnMdl6rh8F51-Ksk3s0JcLKIuoxDKCfpYYAbwIB23KxvPHdcyVFcchIapsppEVZF_rKE9g_7Nv5ExPcButdKPxHNbqyjxtXKX45C-XPlPgDErbvTzKXCp-hrcxpXRb63FTy2lSh_I2c6ea09QdRZRKKc7FGPh6gXULDyOMu7NPSu-TzcA9zuGvfT_Ajqn1rFjeXUbNzF6YmKsqhg5V5UowqSFkVZvFNUt_5mZySw_cM3gNsUkv_K7B3mFZZFWexlNipx6SzHb1T9upUbvDv5XOyu4P6V3Z8tO5pvb2yc7EZF_AyXNHFkE6nkulatQZLUYBqfc89ehBvuiTE9ufZ8pL8z2c17ITPpV8wVrqIqT9NXkpC75pu6a9xZc0Yan3VsjhwojSfm8F7gNbe9DYm3RJKlyyIuUamUcL9b6f_uxU72SjSPMpyn6V6YxRBNHGISfRjN--2d-TDuuak7kLKfDm9_kTvqRhqr_R8XlD7YdTihZ41b2u-JBmlvZKW29n-a5phHWYxJr5aajSSISVaOGN9C-aL2j-uDU-Q4Jdk-4ONw5AFmjEWoAV0pXc99rWDe-IuFsawbMiuigS0aq4P4cr_iQbWawu3SlSmvhIPbX26-Xjq2n-2Bst0Kru8ae0u4vFSy4stB8tsbPXRvOBozR3DSq4Z-UUtOiXirOn5tQYCLHe-t5H-0cMB7d4XaeeABVgwq0gq7YCDAwutrXJ39ZVjDjSXwdjHeA-m9svzT-dlTd8WJAGq_wpIbq9eHynFMAfY1ezys2U9CMm-oJx6qJ8vKsh99TSO4nUt2rxUFY7a0_i1K9w80iaMz-mMPVnO5_ArVq49P0ZHjaFaW--QDxyNfh8vBNfL_Yx9wgsKJ0rTs3dHiZCwcNiirh8LZJGR0RbrUa_5RdX0L2RNFjPWKWpyOEasY_imI_SOhqRjeQzOsGRMcMRqjmnB5erTHWZYwGu9pz4ctD3jGZiFaLAQv6cJYou3CJTELz407kZp2e7hZGwaNo0o2VmxaIcaLpqsgnqdFEM-jbHNkMT4SktB3vS245HZ8SvfRbT3xW0-p2wu7HfE2bs9e2nHAxEv0v7hznLsUJu02HrcU4ajIUtRteZqyLbJNBHqA5a4WRD4MOIKp0uCb14BtVGDYZee7VtXSIAEM1fCpdrqmFU4ZoriIcOoM_GnF6QrdoBIEh0dAbcOIBYa2naSvXSX9PX0fQRYiDaZR0vBSAKqU9r2ABpYexinqoJr8hP-6neZyjZQEpCp_0L7x9okLgWryHQYEoKVC5ImsA99_GE3RLfnuZvuGRYcQ7PoQkVQWEcfSpoczCx0ySiMNtXrcrtpNJ8KqJdgV6KnTlrsKUdVq4-F84nalWrvpBjVuoYYA58YdsvJbqX2b7ka7wjmeom-tlm5cVZUj5bD3r6OKT6HDtqeSx1qKP9JG_I724c-3De9aFy0Yu21I3HGBvFlxgxqtWEvBdIJSWgO1TtNa0bUDHDZYd3ztOmzf129cQ92VBD-z3_jopj-73_gDHFBjX2k3dl47BOcXw1c7j7vVB43HB-3Hv8lKadtKYkGsvUOo16hpdaOMFyc3iJvO1iRSTeecLpHhkkLX98-UMwCjauhMxRkTImYt6UorqVqD4Blo6521UegGrcij977e-h1foB-J5Y-wUWXEgHKnlWba2Vk8RVfK07DT9Z1Ko72ubw3tT7KzFzp732MfP0Xx_6Ma7T-s-B_X-gvn7J1ugzHO7REh1ojUqpXWONVcch9A2qbrkjYWCHMxzCixiyyNVqWAeoo2QTPA8ymaG0SQaYByIpzG-vDCK_QEiDnLyS0yYNHW2aLO2SLnbIlkyFgXFiulKXhtQ522oS6W4MvuYGIMWhG5NIhLBpXLLEGsR372r40wLxnHh6zDA-hfT_l1E3JXpGlAeqt-gdne0jN2HrNZPCNncB7laRznUTQLz1bnYTZL8AwoqwAn8SwpYxxBSMN8lmcFxdUZP8chTsMcJ1Eax-FsiktaZVCWeRmVeZElQRJCTbiYujxwqvTyzL9QcR6lYZJEZ4KUIIx_VwpjCU_IjwYYB-nVmT73yWPZLk2QhIIba_bbWG4FnN9JQA5xNMjikJKd_apmlxgZ9LQCuZvnX1069IDef5NtpuQdcWd3-7c3vJo5BXNbHKjYWavF-edfMtnA8niO_y8AAP__YaAx0A">