<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/118641>118641</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MLIR]`-test-linalg-elementwise-fusion-patterns=fuse-multiuse-producer` triggers Assertion `op->use_empty() && "expected 'op' to have no uses"' failed.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
xisang0
</td>
</tr>
</table>
<pre>
Test on commit: https://github.com/llvm/llvm-project/commit/a9882bda96228ca23e166a817f93a7dbc99763cb
steps to reproduce:
```
mlir-opt test.mlir -test-linalg-elementwise-fusion-patterns=fuse-multiuse-producer
```
test case:
```
#map = affine_map<(d0) -> (d0)>
module {
func.func private @printMemrefI32(tensor<*xi32>)
func.func @main() {
%0 = "tosa.const"() <{value = dense<70> : tensor<84xi64>}> : () -> tensor<84xi64>
%1 = "tosa.const"() <{value = dense<0> : tensor<1xi32>}> : () -> tensor<1xi32>
%2 = "tosa.const"() <{value = dense<70> : tensor<84xi64>}> : () -> tensor<84xi64>
%3 = "tosa.const"() <{value = dense<140> : tensor<84xi64>}> : () -> tensor<84xi64>
%4 = tensor.empty() : tensor<84xi1>
%5 = linalg.generic {indexing_maps = [#map, #map, #map], iterator_types = ["parallel"]} ins(%3, %2 : tensor<84xi64>, tensor<84xi64>) outs(%4 : tensor<84xi1>) {
^bb0(%in: i64, %in_0: i64, %out: i1):
%12 = arith.cmpi sge, %in, %in_0 : i64
linalg.yield %12 : i1
} -> tensor<84xi1>
%6 = tensor.empty() : tensor<84xi1>
%7 = linalg.generic {indexing_maps = [#map, #map], iterator_types = ["parallel"]} ins(%5 : tensor<84xi1>) outs(%6 : tensor<84xi1>) {
^bb0(%in: i1, %out: i1):
%false = arith.constant false
%12 = arith.subi %false, %in : i1
linalg.yield %12 : i1
} -> tensor<84xi1>
%8 = tensor.empty() : tensor<84xi32>
%9 = linalg.generic {indexing_maps = [#map, #map], iterator_types = ["parallel"]} ins(%5 : tensor<84xi1>) outs(%8 : tensor<84xi32>) {
^bb0(%in: i1, %out: i32):
%12 = arith.extui %in : i1 to i32
linalg.yield %12 : i32
} -> tensor<84xi32>
%10 = tensor.empty() : tensor<84xi32>
%11 = linalg.generic {indexing_maps = [#map, #map, #map], iterator_types = ["parallel"]} ins(%9, %9 : tensor<84xi32>, tensor<84xi32>) outs(%10 : tensor<84xi32>) {
^bb0(%in: i32, %in_0: i32, %out: i32):
%12 = arith.shrsi %in, %in_0 : i32
linalg.yield %12 : i32
} -> tensor<84xi32>
%cast = tensor.cast %11 : tensor<84xi32> to tensor<*xi32>
call @printMemrefI32(%cast) : (tensor<*xi32>) -> ()
return
}
}
```
crash trace:
```
mlir-opt: /home/llvm-project/mlir/lib/IR/PatternMatch.cpp:162: virtual void mlir::RewriterBase::eraseOp(mlir::Operation *): Assertion `op->use_empty() && "expected 'op' to have no uses"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
#0 0x0000000001119717 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (build/bin/mlir-opt+0x1119717)
#1 0x000000000111726e llvm::sys::RunSignalHandlers() (build/bin/mlir-opt+0x111726e)
#2 0x000000000111a0ea SignalHandler(int) Signals.cpp:0:0
#3 0x00007f10e5a89520 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00007f10e5add9fc pthread_kill (/usr/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
#5 0x00007f10e5a89476 gsignal (/usr/lib/x86_64-linux-gnu/libc.so.6+0x42476)
#6 0x00007f10e5a6f7f3 abort (/usr/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
#7 0x00007f10e5a6f71b (/usr/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
#8 0x00007f10e5a80e96 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#9 0x0000000004657582 (build/bin/mlir-opt+0x4657582)
#10 0x0000000003ebc7de (anonymous namespace)::TestMultiUseProducerFusion::matchAndRewrite(mlir::linalg::GenericOp, mlir::PatternRewriter&) const TestLinalgElementwiseFusion.cpp:0:0
#11 0x00000000065a711b void llvm::function_ref<void ()>::callback_fn<mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>)::$_2>(long) PatternApplicator.cpp:0:0
#12 0x00000000065a3cdf mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>) (build/bin/mlir-opt+0x65a3cdf)
#13 0x00000000044dca9c (anonymous namespace)::GreedyPatternRewriteDriver::processWorklist() GreedyPatternRewriteDriver.cpp:0:0
#14 0x00000000044d931b mlir::applyPatternsAndFoldGreedily(mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig, bool*) (build/bin/mlir-opt+0x44d931b)
#15 0x0000000003ebaf92 (anonymous namespace)::TestLinalgElementwiseFusion::runOnOperation() TestLinalgElementwiseFusion.cpp:0:0
#16 0x000000000445988c mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (build/bin/mlir-opt+0x445988c)
#17 0x000000000445a212 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (build/bin/mlir-opt+0x445a212)
#18 0x0000000004460110 auto void mlir::parallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_15>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_15&&)::'lambda'(__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>&&)::operator()<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&>(__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>&&) const Pass.cpp:0:0
#19 0x00000000044611b2 std::_Function_handler<void (), llvm::LogicalResult mlir::failableParallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, void mlir::parallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_15>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_15&&)::'lambda'(__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>&&)>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_15&&)::'lambda'()>::_M_invoke(std::_Any_data const&) Pass.cpp:0:0
#20 0x0000000004460c28 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>>::_M_invoke(std::_Any_data const&) (build/bin/mlir-opt+0x4460c28)
#21 0x0000000004460b87 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) (build/bin/mlir-opt+0x4460b87)
#22 0x00007f10e5ae0ee8 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x99ee8)
#23 0x0000000004460f3b std::__future_base::_Deferred_state<std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>::_M_complete_async() (build/bin/mlir-opt+0x4460f3b)
#24 0x0000000004460fb8 std::_Function_handler<void (), std::shared_future<void> llvm::ThreadPoolInterface::asyncImpl<void>(std::function<void ()>, llvm::ThreadPoolTaskGroup*)::'lambda'()>::_M_invoke(std::_Any_data const&) (build/bin/mlir-opt+0x4460fb8)
#25 0x0000000006716fb0 llvm::StdThreadPool::processTasks(llvm::ThreadPoolTaskGroup*) (build/bin/mlir-opt+0x6716fb0)
#26 0x00000000067187c7 void* llvm::thread::ThreadProxy<std::tuple<llvm::StdThreadPool::grow(int)::$_0>>(void*) ThreadPool.cpp:0:0
#27 0x00007f10e5adbac3 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x94ac3)
#28 0x00007f10e5b6ca04 __clone (/usr/lib/x86_64-linux-gnu/libc.so.6+0x125a04)
Aborted (core dumped)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW1tv2zoS_jXMCxFDou4PeVDt-GyAFg3a7u6jQEmUza1MakkqdfbXLyjSusWOE7c9Lc5J0aY2RX5z-WZGQ4nBUtINI-QGBO9AsLrCrdpycbOnErONc5Xz8vHmC5EKcgYLvttRBbwUbpVqJPBSgNYArTdUbdt8UfAdQOu6fjj8d90I_h9SKIDWdila4ySOUV7iJEQoLjDyiBuGOHajKvFwVOZFkkShV-TASaUijYSKQ0Eawcu2IFqik4LQsX-ddFdTcc0bBRWRaqG_wWv98bqmDNeba1KTHWHqG5Xkumol5ey6wUoRwSTwVlUryfWurRXVH6wQMROh4WCB5RHpAHk73EDgrSCuKspItsMN8JYAxaUDUAKvgXcLD9-Ad6s15mVbEwiid8BJIaxaViz0D9gI-oAVgcB3GkGZ-kB2glR3HgIoVoRJLjrkdE89pKFQMgMAvrPDlAEUa9EHARACFDidjgAhxSVeFJxJBRA6zPSWIHr3gOuWdNNKwrSxy8jptPdS2IuP_T0NfS09Wh0uWpTO1CMTex3cS3R4qoJ7sP-MBv28XgH0GzjBu0QH1_-xSvgdupmxILtGPfYKzCS4k3VBt85k1mJDGBG00HFGWUn2lG109EtjYPDO5AZAS_jkU7DSX6giAisuMvXYkNEy1GCB65rU2jHBCkQrSJnsNAw8g9JRedQZaHl0NIG8VRbDP2HmNGeC2zx3zALK9AINZYRTljnTEd52VZG6XZanFsNEvYk6LKjaLopdQ6HckB5ohAgPkIfF1s-PlNRlj9QJsSpGqyNUTxkLL2Q6-i6mL-c3OM3NQGB4lsAj7LnnqapwLcmYLZ2dmCnYXThJqmxz2i_vCZ1y9WPYjF_M5qzyJb8znfEp9V_Fp75NPpt7ZK9aOuFGtxZ6nZOeZMdcPUnPzM2ucylBrvvLS2tiHXpS2Xlp7UkaqHSd81weL66avmlx7UeOMfwkB7dC0hMltefwdBK-juYCSzUm2ny3JB6zXgfasQ7OIBa4ro82fVbUIX5OtoF9l2lbQkFUK1iHrpsDJ7U_R41rIbDcQiXwcz21Ebre8h152tDrSXqU5gCt7z4BtL43ffUHrIrtomga4KVuiDTIAxWqxTV84LSE3UIvBV76iXwTOlLf2d7aS4nAknxsAIqHWR8bHcuUMwhQaiIAplISYcZChzfa_laSbJJxKAQo1J0W2TekUEQTHvEGoEjTscUPBDIOW0lk14BFsMK0JuUCOOn9-9v08y2Ubb6jCmKYtxu9B-FCdUtfu_ehUrZayhpiVkLKirotCVRbAg0NOS6-dlQsTGh7DnT2zuGP67pJ5Eaww-48Ih-l-XCvI-azwsXXLx2TKB4mCfwt41IJgnedK5aQMhNKKM5bWpcArXOdLeuebvTO2VtpNpIA8tyZLhEKyTFdPrXsM90wXP8Ds7ImQvY8nBGnAQdxaCYOOwTDCTBAsbXEDEsba073z6B4FiWqXIcEOE4C5JgEWbdyCNt9HGahr7eK7f56w1pzoVhIvgg79XwUIGdQzp_ClmVSFbBRW0FwmX2lOo1fLyMJk6oYZARz1f0ohBvZmXqZCX4UDvDhFD6sosqDONehfQE4iqPKG8CjJ-BufiGsmw-w8cwlDknCS2C9hCQjVyTjUPPDIApidCZc7SyDoZNjkqkeyYuoJBoDM84ed7yVkOEdkU2XnYnJlC9Eqg9treg_Jbm3jxzW3aMJc32nC2jKSlseJ8XQ3MDM5z9Ml_Cxu_0PU2wZPhTXLvkT2PWyUIt-30HcDs9FjOxZFmnjJqkfBjhy3dzU8CH_q5YVuhBnglTAW3ZX7Z3IuzVT9P1Nl7isYsBbPlE0bZqaFrpbOW9-fy_obgXnrF6e1jPnvMumJwDQbslDa8FzIAdjvwtkuPCeb2iB609EtrV6Ga6NKID8zPQCcc3ZRvP9xLlH-EUzfr2irJ669I2f7-DnTD2xTh_qiTepSX5Z4KQ4V0_-EISUj1MHrwR9IFa5RvCCSPlvLr7WVKvX3ZdPrzoSKf5MrcRz8xG5uGnqA5RMWbnmddnh0_px4qdPZNMFRzgNjrXg_yMHJSzOZ6JG7hzPNprb2UvOKrrRE3TImA7xXBE3-g9OD2ZFHFcJekkRP1FJbf_Vso9slA-d019Xf8Op14MkjouRH0qiMK0PifeFf2zusZRpiZs-V0XLZnEq5ZPUPJ20KcP1o6TyA2Z4o5P24OUlbFn32qB8WVdplR9cHs1Mw8hFrzbtnjakpmxegvTUXuPwh9s6rWpS3jGpRKvJ5OJI2RtPMJLNBav7PRaEqTtW8UO0vyiCO4cN7oyn7gwd13UgbhWfb7kO-_81F7e42AJvmWUb1mbFfm8mZBnjYofr7PAIYXLLfhkvo7hP5SMr7nZNrQ3q3Jn0NH3QVluPSVWa8QdS_BlCRxJxXfPiz7BU90O39nbzMwTpLsANTBsw4H94f_dpyZkie2V9_cb4r2D8zet_sTzrni-NBqMa7_ISAxQBFL-x_eezPeGDN9bRdi_6ky0PTdl9o_2X0W6fcGjgI610MmuQXDdHg9bZ-rDn29pnjNMnGZP94XQbOBhZYVrjvNYd3VuL9cujYvnW-f6etLx1vn83xt-8_hfLs7fO9zdjOxw9cn4rgL8ZOW9e_3sVwPGrz-xDRtkD_0oAiofdRsoesxIrPH5ddGLjgpz5k90Cxc9vXPqLLaP_bUnWqMlollWtagXJ8v7UTWb2MmZkzNu5uWZkRWqitOjb0X7pWYwvWH7NJFHq-xS2uzTL98VaTxabwxx2zl3H3UQb1TY1GQ8cXhceefk93okcBl4ZFefeA3Tx0L8HQO48WvI4et4xnxVWZuBfqNeu5JqdsXYjK3-D-NJuTV_5zq_zxeApND1TQhxC4otO7ySEjAjw5gRUXv68vStSESFImUnNxCTUfmYoWqYLvmu0dzOsS96LjmxZqwab_Sc252dK1OzZSj9XbrH2hHHSkN2jhy9fOp_cc17fMUVEZc8veinuS_aoKByN35lrJs92Bnhdov4QvG36Q4c_rNK_wL35KKQmb6fDyA2r3Bmp_FmVg9ZmyL7w1ybIyZnAk-adO6ZgpA46hTOd4qiITGyhdKTbOIKtbMH3j8eC-FmDNoJ_64_9DXdi5xDXsRXdvWLv1x65m84OqJU5LryLst7HhTe4Y3pALQ8L7Pgwy4qaM3IJvIsC7PgGP825MIdX44ILAst215DSyj4c2r0qb7wy8RJ8RW7cyPM85MRecLW9cUkYBMgNIz-KvbiIC7cKiqryndAtywJ5V_QGOch3keO7vuN4waLKAxQ5CUpKl8QlcYHvkB2m9UIztOBic9UdZ71x3Tj03asa56SWN-Z0uTkTjECwuhI33SHYvN1I4Ds1lUoOCIqquvuFQ71DAcEKhM73_9Je6EAl6GZDhPyp54OvWlHfXH4G2Prt4Qb9PwAA__88p3IW">