<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61844>61844</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [MLIR]`replaceOpWithResultsOfAnotherOp` leads to assertion failure on `-test-legalize-patterns` pass
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          BealZephyr
      </td>
    </tr>
</table>

<pre>
    Test with llvm release 16

Steps to reproduce:

```
mlir-opt test.mlir -test-legalize-patterns
```
Test case:
```
module {
 func.func @emulate_addi(%arg0: i16) -> i16 {
    return %arg0 : i16
 }
  func.func @check_addi(%arg0: i16) {
    %0 = call @emulate_addi(%arg0) : (i16) -> i16
    return
  }
}
```
crash trace:
```
mlir-opt: /home/ty/fuzzer/llvm-project-16/mlir/lib/IR/PatternMatch.cpp:365: void mlir::RewriterBase::replaceOpWithResultsOfAnotherOp(mlir::Operation *, mlir::Operation *): Assertion `op->getNumResults() == newOp->getNumResults() && "replacement op doesn't match results of original op"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /home/ty/fuzzer/llvm-project-16/mlir/build/bin/mlir-opt test.mlir -test-legalize-patterns
 #0 0x0000000000481cad llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/ty/fuzzer/llvm-project-16/llvm/lib/Support/Unix/Signals.inc:567:11
 #1 0x000000000048213b PrintStackTraceSignalHandler(void*) /home/ty/fuzzer/llvm-project-16/llvm/lib/Support/Unix/Signals.inc:641:1
 #2 0x00000000004804d6 llvm::sys::RunSignalHandlers() /home/ty/fuzzer/llvm-project-16/llvm/lib/Support/Signals.cpp:104:5
 #3 0x0000000000482865 SignalHandler(int) /home/ty/fuzzer/llvm-project-16/llvm/lib/Support/Unix/Signals.inc:412:1
 #4 0x00007fac757d8980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007fac746c8e87 raise /build/glibc-CVJwZb/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007fac746ca7f1 abort /build/glibc-CVJwZb/glibc-2.27/stdlib/abort.c:81:0
 #7 0x00007fac746ba3fa __assert_fail_base /build/glibc-CVJwZb/glibc-2.27/assert/assert.c:89:0
 #8 0x00007fac746ba472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
 #9 0x0000000003d6c571 mlir::RewriterBase::replaceOpWithResultsOfAnotherOp(mlir::Operation*, mlir::Operation*) /home/ty/fuzzer/llvm-project-16/mlir/lib/IR/PatternMatch.cpp:366:7
#10 0x0000000000c39b79 mlir::func::CallOp mlir::RewriterBase::replaceOpWithNewOp<mlir::func::CallOp, llvm::StringRef, llvm::SmallVector<mlir::Type, 1u>&, mlir::ValueRange>(mlir::Operation*, llvm::StringRef&&, llvm::SmallVector<mlir::Type, 1u>&, mlir::ValueRange&&) /home/ty/fuzzer/llvm-project-16/mlir/include/mlir/IR/PatternMatch.h:454:5
#11 0x0000000000c36dd8 (anonymous namespace)::CallOpSignatureConversion::matchAndRewrite(mlir::func::CallOp, mlir::func::CallOpAdaptor, mlir::ConversionPatternRewriter&) const /home/ty/fuzzer/llvm-project-16/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp:34:14
#12 0x0000000000c398a9 mlir::OpConversionPattern<mlir::func::CallOp>::matchAndRewrite(mlir::Operation*, llvm::ArrayRef<mlir::Value>, mlir::ConversionPatternRewriter&) const /home/ty/fuzzer/llvm-project-16/mlir/include/mlir/Transforms/DialectConversion.h:427:12
#13 0x0000000003b0506b mlir::ConversionPattern::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&) const /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:1705:10
#14 0x0000000004a54e90 mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<mlir::LogicalResult (mlir::Pattern const&)>) /home/ty/fuzzer/llvm-project-16/mlir/lib/Rewrite/PatternApplicator.cpp:200:25
#15 0x0000000003b10e70 (anonymous namespace)::OperationLegalizer::legalizeWithPattern(mlir::Operation*, mlir::ConversionPatternRewriter&) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:1987:21
#16 0x0000000003b1058b (anonymous namespace)::OperationLegalizer::legalize(mlir::Operation*, mlir::ConversionPatternRewriter&) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:1895:17
#17 0x0000000003b0facf (anonymous namespace)::OperationConverter::convert(mlir::ConversionPatternRewriter&, mlir::Operation*) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:2406:26
#18 0x0000000003b0735b (anonymous namespace)::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>, llvm::function_ref<void (mlir::Diagnostic&)>) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:2455:16
#19 0x0000000003b07027 mlir::applyPartialConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget&, mlir::FrozenRewritePatternSet const&, llvm::DenseSet<mlir::Operation*, llvm::DenseMapInfo<mlir::Operation*, void>>*) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:3360:22
#20 0x0000000003b0759e mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget&, mlir::FrozenRewritePatternSet const&, llvm::DenseSet<mlir::Operation*, llvm::DenseMapInfo<mlir::Operation*, void>>*) /home/ty/fuzzer/llvm-project-16/mlir/lib/Transforms/Utils/DialectConversion.cpp:3366:10
#21 0x0000000003813462 (anonymous namespace)::TestLegalizePatternDriver::runOnOperation() /home/ty/fuzzer/llvm-project-16/mlir/test/lib/Dialect/Test/TestPatterns.cpp:925:18
#22 0x0000000003a69757 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /home/ty/fuzzer/llvm-project-16/mlir/lib/Pass/Pass.cpp:471:21
#23 0x0000000003a69d6d mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /home/ty/fuzzer/llvm-project-16/mlir/lib/Pass/Pass.cpp:534:16
#24 0x0000000003a6b6ac mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /home/ty/fuzzer/llvm-project-16/mlir/lib/Pass/Pass.cpp:839:10
#25 0x0000000003a6b5d1 mlir::PassManager::run(mlir::Operation*) /home/ty/fuzzer/llvm-project-16/mlir/lib/Pass/Pass.cpp:819:60
#26 0x0000000003a61f32 performActions(llvm::raw_ostream&, bool, bool, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, bool, bool) /home/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:91:17
#27 0x0000000003a61b8f 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/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:139:12
#28 0x0000000003a61948 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/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:181:12
#29 0x0000000003a6183d 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/ty/fuzzer/llvm-project-16/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#30 0x0000000003b93a99 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/ty/fuzzer/llvm-project-16/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#31 0x0000000003b93075 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/ty/fuzzer/llvm-project-16/mlir/lib/Support/ToolUtilities.cpp:28:12
#32 0x0000000003a60873 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/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:186:10
#33 0x0000000003a60a0f 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/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:209:10
#34 0x0000000003a61651 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) /home/ty/fuzzer/llvm-project-16/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:306:14
#35 0x0000000000411609 main /home/ty/fuzzer/llvm-project-16/mlir/tools/mlir-opt/mlir-opt.cpp:271:7
#36 0x00007fac746abc87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#37 0x00000000004112ea _start (/home/ty/fuzzer/llvm-project-16/mlir/build/bin/mlir-opt+0x4112ea)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW1tP47ra_jXmxqJK7BwvuOhQqm8-wQIBa21p3VRO4rTe4zrZtjPQ-fVbdpLmUAptgVmzl9ZoRA5O7Pd9nvdkxyVKsaWg9AL4X4A_OyOVXhXy4gsl_E9arjbyLCmyzcUjVRo-Mb2CnH9fQ0k5JYpCNwDODDjT-u-DpqWCuoCSlrLIqpQCPO0_AAKn-W8v15zJ86LUUFOlJ-YKnpvTc06XhLMf9LwkWlMp1IuvW5lSonqjjPovsopTCMIv9TXMK5FOzB8IPIeuK040XZAsYwBFAPlELh2Ap5C5AUAxPAf4ypz3OoAQSqorKWDzOGyfr9tBOGufHIyVrmj6bf9IgwEA8k23M5gSzl8R1LyHpxCgaCTvWNb2eitcdzLEK5VEraCWJN0PaUNZPfJ8VawpQHO9AWieVz9-UAnQ3FjIeSmLf9NUnxvR5uYt08ASgOZf7wGa39XE3hCdriZpWQI8xYFvev1esAzaF_AU4Ok9fZJMU_ml4RlPJS05Selt-S-mV_dUVVyr23wqCr2i8rYEKOrevi2pJJoVhq8pQJdwb1Nsxp4qRWV9L3CK0gC6pPq3at0MY9E3sM8MP4I-3e5_BgUABRAg1Mi7pkLDooRZQZUAKNRwbZSHsn4NFjksJFsyQTgsSoAQQCHMCeM0m9TY311fTR-uoKqSNdOQwKRaGk8rpDY-t9K6VEY1NAdovmR6VSWTtFg3hIx4AWjOlKqoAmgOicggEymvMgr1isLaDhKSfrO2MGm9m6TfYFaty61xOBPgxHeyWEqyhkQuK6OkOsk2korxzByZaG4eExkgQNiBzrOz_edFbkoyG61qvtVG1Sd3kgltlXm0lo6i7iFJnhaF0pKStSXwEjKhazoP1acF29r6Q1UafgCa_y7Ys7nBloJwNWEiBXjqByHAU9ftlHBHSiAXJ3Akcd3H_xGRcSNDZDymtuFPEjPwXCNmJyUaSel4WfAS1PeVGAjbOcc7xWzlqyOH63gGzE4-PEYxCnw4hu1TmfVcNITMa0QKc5KGfphFceTAxUJSpQtJF1JDi03T-3MULALvnDNRPZ8vRVU3lHolKckmqpg4AH1xnl0URyYRdMP4_WG8II1oFEJJmKKw52RLzpL0_PKP_3_6M9leogkKAZorqwdA88nEXG1URksTJapaTbVR3600ojKXtuuJtWVjI04nSTCShIS5C0lSWE0Pk0RnNRr2LTtINBokHA6SEJwTuFgQG8cXJnouEnK47vV725N6yHg4ZDQe0gvRAdylhrXAsoYdL0QD1uK-veIsSP3Q_fgcuD8FHh09DkzoAcDTsKkjEHaHETrFcRLGPXFMsVSfXRLOb8vDEfjNZGKAL_f3ZRTvAtSDlkws72k-ur0mnP9BU13IQWePm5KaJ90K4KsmL3StfxBe0XsiltS2voL8iwIETYcfKEbT5wmENlVAd2OX25WJbn4v4Bpm3RGzQZZFximIKMRmXVQKCrKmqrT5Nu4TY8OmriS9LMR3KpVByzbb6mgqsob6AbAvsbu_dZqR0mA5eKgbrtGuNbEGurQQSp_qETNGeF1kzY0saP4oiVB5IdequdcN3yYxbCB1vQ5TNPaWiMQD591R4XUPwFdvA7vfYqdSko0x2P4Y1uasMf4EaHdscwBqA3k3dm2oyBZYqEN1UBrgxPGdIHlN9uMx61o-wbIGOv-uGX9Z96YuCh3flked-l5ffY_4Ho2dXYmnZclZSmwA-lj1-yZlLNS8uJDWrJKi4HDQddNBjViNXmNsezuxs8f3dtK9fF0sWUp4nWEP6_fkNLoFd77DQsMnchzztxd3_aE1uw4Nnbfi7paw62Yu1SjUTq1MQm2N_zCi33L4n2LrcWRcHbkdOMEYHD9K3gvO_xIiUWy9v1eAhaPgl5M0PxiRegDdIpLWlwNAXlf7E0rPowBBnmMKUhR0gEQjQELsH24iLwOybVaDlYUX8-cAhaMj24yRpSiUZulHhJ8jofStbfWgjMdQOijsEU7Kkm_uiNSM8F6pdwpEL9nbI5FLqnfMbC6LH7S1wsYmH6juBe0-4jMqFH2ger8Au4_fkPKryItXX7ELNKb8uvqJ1o5xYLNFV_sgZ0yRH9NDKDou4v1DxQtUBMM6DA0mTDhysRegtwLPI1W6TUsNgDPJvrfxR1biVvT0PXKlrVFPU8PGzjzmsb5tDs3Q7bwlRjYSRJ1ug4kLJkEc-v1IkFFNGG_peSxuyzuiVDtJa1UZ1VpKvbF60W-ZCsI3iqkbIsiS2omfKS7NsRL2c1d2_LrugP5aIHtoYPBCd1h-IDyGIQuyo2G4YyXlTIzrDvPoVrtXU-tJuAyreKW-CqWlXdw30-idMr__QD1y3dDIfkckFdq4Zuvs7_G8Xej9eurc5SLkjaBPApKOJG4x2AJNlKLqwGC3A-QHahPheBQr_LE2fua-oc0renykqK4RNeiJGoxEdXOMYEmliZTTdLcq2v3e0hpke1Q6az4qrIik2aLUEuDL3mJZUcmU3iwlwFeDXNLpf3P99f6yEJo-653EcdrMb-h87XxyKPrpqaUobDbZfmpF8xvO5G2pbwhrU0rsDkt7FI6RT6IclrJIqVJfqjy3nzxeA34LdCXYfyq6A_QNXRdy03bVez6jOam4XmSUU033v9Nk3V2K3zp-DluDOtpkuXu6ZErLzU4t8mi_utxZad5VMxxCrFu7f69qi8bMxl7Ut-6ui1-G4b-GsWPtqvHTukuAvIVTnxY2XppMZ0oogKK_Argxfe9dNzzI9uzntb7txWPbi3C_hhmSeArrvwS026XxlHCekPTbIh-upf_jYx_pY1cGw0Is_yq8dl3r6D0A3beI5sZ09gjQ_OHxet6QQfjVs5ZENd_Lhn6FRzPxGJM4_hv4z98kcp5GchCNSHbHJDuh33MwVXKmpyK7GxVpv3YI-SUYffOJDyvGu20-JoP-rhlnmtF2AoTGlI-XPpwoxP_Uah-XRz65_Bmt0uHxEo5DnPwXp3NITbsEc3l9R6Sics8M-SM5-jlcIWe0SoLHaz5u4Lt7uWpWudIVqdez9m_PORSmz1UX2y9Xvd0h2B9ucXTdwInhmjBxwpLvrgTtaYu2XdzsVhvGm_tIkkYhXCw4S9KF0kTqRSvKIdvuUlW1-w3rU9to-7Fb8LDndXvwzPDhWHlECawHbrbifcTmY7tZr-58u1tvux3-LLvAWYxjckYv3CBy3CiMIny2usCO71HsZmESogS7fp6FToBySqOMED8kZ-wCOQg7GDuu57sIT5I8z3KSOGmU5VGeBHbLP2F8YuSdFHJ5ZrdqXwRu5HlnnCSUK_tzDYQEfYK2ESAE_NmZvLA6JtVSAc_hTGnV9aKZ5vZ3HjfXX--BPwOB89Y-wsCBnJLM_qiDbDfH54TxSlJY75PftzE7cGBJlDqrJL84fXO6Vfq_AQAA___QU7uC">