<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60491>60491</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir] Dialect conversion passes try to rewrite top-level op
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rkayaith
</td>
</tr>
</table>
<pre>
Some dialect conversion passes will attempt to rewrite top-level ops, for example `convert-func-to-spirv` is op-agnostic and has a pattern that rewrites `func.func -> spirv.func`. Since `mlir::applyPartialConversion` adds the parent op to the worklist, the pattern applies and we get a crash:
```mlir
// mlir-opt %s -no-implicit-module -convert-func-to-spirv -debug-only=dialect-conversion
func.func private @foo()
```
```
//===-------------------------------------------===//
Legalizing operation : 'func.func'(0x4fadff0) {
* Fold {
} -> FAILURE : unable to fold
* Pattern : 'func.func -> ()' {
** Insert : 'spirv.func'(0x4fbff00)
** Erase : 'func.func'(0x4fadff0)
//===-------------------------------------------===//
Legalizing operation : 'spirv.func'(0x4fbff00) {
} -> SUCCESS : operation marked legal by the target
//===-------------------------------------------===//
} -> SUCCESS : pattern applied successfully
} -> SUCCESS
//===-------------------------------------------===//
func.func private @foo()
free(): double free detected in tcache 2
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: mlir-opt /home/rk/tmp/test.mlir --convert-func-to-spirv --no-implicit-module -debug-only=dialect-conversion
#0 0x0000000001305a77 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/rk/tmp/llvm-project/llvm/lib/Support/Unix/Signals.inc:567:13
#1 0x0000000001303d20 llvm::sys::RunSignalHandlers() /home/rk/tmp/llvm-project/llvm/lib/Support/Signals.cpp:105:18
#2 0x000000000130638f SignalHandler(int) /home/rk/tmp/llvm-project/llvm/lib/Support/Unix/Signals.inc:412:1
#3 0x00007f1f32fa6420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#4 0x00007f1f3126f00b raise /build/glibc-SzIz7B/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
#5 0x00007f1f3124e859 abort /build/glibc-SzIz7B/glibc-2.31/stdlib/abort.c:81:7
#6 0x00007f1f312b926e __libc_message /build/glibc-SzIz7B/glibc-2.31/libio/../sysdeps/posix/libc_fatal.c:155:5
#7 0x00007f1f312c12fc /build/glibc-SzIz7B/glibc-2.31/malloc/malloc.c:5348:3
#8 0x00007f1f312c2f6d _int_free /build/glibc-SzIz7B/glibc-2.31/malloc/malloc.c:4201:3
#9 0x00000000028efef0 llvm::DenseMap<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >::getNumBuckets() const /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/DenseMap.h:861:12
#10 0x00000000028efef0 llvm::DenseMapBase<llvm::DenseMap<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >, llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >::getNumBuckets() const /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/DenseMap.h:525:49
#11 0x00000000028efef0 llvm::DenseMapBase<llvm::DenseMap<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >, llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >::destroyAll() /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/DenseMap.h:361:9
#12 0x00000000028efef0 llvm::DenseMap<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> >, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, std::unique_ptr<mlir::AsmResourceParser, std::default_delete<mlir::AsmResourceParser> > > >::~DenseMap() /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/DenseMap.h:754:11
#13 0x00000000028efef0 mlir::ParserConfig::~ParserConfig() /home/rk/tmp/llvm-project/mlir/include/mlir/IR/AsmState.h:458:7
#14 0x00000000028efef0 performActions(llvm::raw_ostream&, bool, bool, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, bool, bool) /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:105:1
#15 0x00000000028efa89 processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, bool, bool, bool, bool, bool, bool, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, llvm::ThreadPool*) /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:138:12
#16 0x00000000028efa89 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:180:12
#17 0x00000000028efa89 mlir::LogicalResult llvm::function_ref<mlir::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> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#18 0x0000000002966adb llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const /home/rk/tmp/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#19 0x0000000002966adb mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) /home/rk/tmp/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28:12
#20 0x00000000028ee65e mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool) /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:185:10
#21 0x00000000028eeaed mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::PassPipelineCLParser const&, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool, bool) /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:208:10
#22 0x00000000028eeaed mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) /home/rk/tmp/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:305:14
#23 0x000000000129d7a0 mlir::LogicalResult::succeeded() const /home/rk/tmp/llvm-project/mlir/include/mlir/Support/LogicalResult.h:41:35
#24 0x000000000129d7a0 mlir::asMainReturnCode(mlir::LogicalResult) /home/rk/tmp/llvm-project/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h:97:12
#25 0x000000000129d7a0 main /home/rk/tmp/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:249:10
#26 0x00007f1f31250083 __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:342:3
#27 0x000000000129d4ae _start (/home/rk/tmp/llvm-project/build/bin/mlir-opt+0x129d4ae)
Aborted (core dumped)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWk1T47rS_jVio0rKkT-zYBEIqZcqeC9FZtYp2W47usiSryQz5Czub78l2YkTEyDMDHWYU6QgiRWr--l-ulsfFtWalQLgHIUXKJyf0caspTpXD3RDmVmfpTLfnC9lBThnlENmcCbFIyjNpMA11Ro0_sE4x9QYqGqDjcQKfihmABtZjzg8Asey1ohc4kIqDE-0qjlgFHmtJDMqGpGNjBzpmqlHFHmYaSzrES2F1IZlmIocr6nGFNdWixLYrKnZqtFWlBUxtm94hPwr7CS5axR5Y7xkInMaK84U8mfIn9G65ps7qgyj_HJnkVVO81xjswZcUwXCYFlbm2zDD6keONPGmtLe0KKxshhoh_MH4BIMpjhTVK-tLm-OvO175LV_DkfbRBaILLBtGMnaYERCjUdCjlhVc5YxM6pk3nDAo6PewqMc0qYcScE3yJ93HI16jlotvXtqxR6pAYwCr5ASkQSR6QDc8UuHE_nz9m90-mvXpxPhxN1ASTn7i4kSyxoUNTackD_DiMQ7sIjEiCTeU1DQvCg8RKYYxRetAIwRmeGF5PlBWzxvA2Axu775fn_lRDaCptxGIy4kz_f5aIXcdTQO1beSOheReF-P62j7XgsNyuBt372422FPi8Lzdl7e63ulqAaMTzD7APNvZsICeo2N10wauGTr_OX3y8ur5dJJ6OVVVD1AjrnVhdONyyBDVQnmoww7CugwaXOsmywDrYuG803n50G3D0mAkzKyvVMBdK3-DOeyscFsG3EOBjIDOWYCm4xma8Ck7XN3czVbXmHdpBWzxShtSqyglsrV57UxtbalyeEpmVk36TiTFSILzh-3H6NayX9DZhBZMK0b0LZO2RLHRMabHByBrsrhlGYPRtEMxq36paHZA86bqt4VQG-M3etOyVLRClNVNhUIY3HsV7_FWlaAyEI9ILIwVW3fQZuxvQWPXiqCRwvmSZURI-J72Hvytq-J74U0jrHzhBsq9Ea3X-4UE8bZ9s0ai0jS36Toj5XURgGtEInsCMGEcSlyzKSBf7deZykii2VTW6IQWXwX7Mk2sFJQrsdMZMifhVGM_NnE7-FPBvD9nHjH4N83ohX1f1TkHJRuo-pXEG6hZbVleuKF9j3poZEBtMhPCnwAApHkgxwVTIhF04PxOzBxMSl8UtAoIB5erRRoIxWslGlrfSf9KYlWUTDiTDRPo1I07Q-1WSug-VjLsYfIhfc0CQKyV90R8YN9NRMSFZ6XYkWZBmti2jCe26zjLM1Gy7-u_4ovdpdk7E8QWWhnByKL8dhebXQOdv60aFoz9UY_OjSisZdO9NiFxuTQ4PAQSQBJOMU0lc7S05CYvPWG6-WUJFZJ3CuJDpWkUxIBXq2slFUFWtPyZLs5S5l8bnYttbPbiSyoodwBmYQ22sIeSXyIJJuQIjtVdUU5l9nuS-tOP0iQP9vLtGSggRRRjldMmJWrx7-gKyDe5FDXdD91SAIFFPtZPQeh4ZbWyL_sG5dGMVHeQ2HrjzZ529oI9p8GVrVRyL_sZ8AzXd2Dlo3K4I4qbVNxr1MOBW24WeXAwcAbHe00yb-y_Z8DvBaFfBnko2T5s645GMr4oZg7atV_Glu3_-1dJZj_b6qLJnsAs62qmRT6hQHteFHrhtW-YTb_hshi64CxXUwkkUtxsp2S-BPvtDC5oBoO3PcVP58jfg6Af_n_H56_IbFjVjDt83fylb9_dPx85e8nyN8ctFFyM-P8_UuaU9LWd8PuXtaSr8nZHxMc_92x8SGxEYeBnZJN-uDwjwVHj7qFeilFwcoO4UHT6SidzH2UXcP1vYWqq6WhBhzIIEz6VZvFGBzDWIMqpKpmmWFS6De2N1Ip-f7njjC9pgryjuW9kHA83ZaOJDe4doJ6z9zeXN9fSmHgybgt0v2wKxrhYK0UFAdBcCNLllF-D7rhbgW_72mtb6mgpQ2pyG2gXT2H_i5ft6vhb1Jy3TWOZG1_v-VM_as2t5SJw92Q3ufh0Oc0meJayQy0vmiKwm2GvOby44nU97iFSqrNVtRrOfRCn75UDNl96_NjiOrvmLfbd_dQMm3UpnNIr_Wb25a5c2hmH8ipnwzWX9ExUvdCuhfxecj9e8h6b0h12dmKRCRYee3X9omCVNsHM8nf4rkhge9ZMPxE3CXeIO7i1-PukL-fIfxzeHU3imeU85RmD6tCHOD-SrDfmmBX1olSlH-bw57n1a_P15bfbhYdD5RfPRlFdTcrGiRVcpBU0yiiefpPSJ4_v2T-HMHRcLSeHiO451HXnJmZyO8Gk7JPXjo-B5tv3vEbJt79Iz87bH43jDPDYPv8kQzoJsPNcYhC-Jqc_cax48OmO64yez2Tw21SoJB_diYPWbljNXAm4PKmXe2_sAb-nfR8NE3ESwY0DffFXqXJPfe_xNmaqvZE1Cubqac56KMM9dulfNAberDHMyHTPKbeS9Pvbmxpsgwgh_zdzxde2ubpi-GBunZq454mhz3g4HXAVFtz78E0SlxKqyV5yZpf3Jx6w-EW_DQe1PHwKHjKxHuQmOeKt1-38RxMB_E8ONwQel7ibw83aEOVWW1RnPLgP9PN9nRD-9X96OS4QwB-QPozAFZ9PLQ7oIBbxd1ZlTeN3-JKbcrt2X7hPXUCd4dXZqlUBnIrOZMK3PktG67dz2f5uZ9P_Sk9g_NJFId-PInI9Gx9TqI4m9IkzNOw8ILpJItjHyYFnXrTKM5D74ydE4_4HvEImdhp1ziiXhHRAPwkywq_SFHgQUUZH1vwY6nKM3fi7Dyy4s44TYFrd0CZkJZMgsL5mTp3tqZNqVHgcaaN7gUYZrg71Ow6hHM8f_H4slGbl04tnzWKn__8cTmH_38BAAD___a697w">