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

    <tr>
        <th>Summary</th>
        <td>
            [MLIR] Conversion from cf to llvm dialect fails for basic blocks with index arguments
        </td>
    </tr>

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

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

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

<pre>
    The pass `cf-to-llvm` fails for IR containing basic blocks with index arguments. The error occurs upon the invocation of the legalizer after the generation of `cf.br` ops during dialect conversion in `OneToOneLLVMTerminatorLowering<cf::BranchOp, LLVM::BrOp>::matchAndRewrite()` [here](https://github.com/llvm/llvm-project/blob/a65afce731c2fa91effcfa5d4917d6ad90a28bf0/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp#L84). The cause seems to be an unrealized conversion cast that was generated as an unrealized target materialization.

The following example IR filling a single `memref<2xi64>` with the value `1`:

```mlir
module {
  func @foo(%arg0: memref<2xi64>) {
    %c0 = arith.constant 0 : index
    %c1 = arith.constant 1 : index
    %c2 = arith.constant 2 : index
    %c1_i64 = arith.constant 1 : i64
    cf.br ^bb1(%c0 : index)
  ^bb1(%0: index):  // 2 preds: ^bb0, ^bb2
    %1 = arith.cmpi slt, %0, %c2 : index
    cf.cond_br %1, ^bb2, ^bb3
  ^bb2:  // pred: ^bb1
    memref.store %c1_i64, %arg0[%0] : memref<2xi64>
    %2 = arith.addi %0, %c1 : index
    cf.br ^bb1(%2 : index)
  ^bb3:  // pred: ^bb1
    return
  }
}
```
 triggers the error when running `mlir-opt --convert-cf-to-llvm fill-memref.cf.mlir`:
> fill-memref.cf.mlir:7:5: error: type mismatch for bb argument #0 of successor #0
    cf.br ^bb1(%c0 : index)
    ^
fill-memref.cf.mlir:7:5: note: see current operation: "llvm.br"(%1)[^bb1] : (i64) -> ()

The last IR dump right before exiting with an error is:

```mlir
// *** IR Dump After Pattern Application ***
"func.func"() ({
^bb0(%arg0: memref<2xi64>):
  %0 = "arith.constant"() {value = 0 : index} : () -> index
  %1 = "builtin.unrealized_conversion_cast"(%0) : (index) -> i64
  %2 = "arith.constant"() {value = 1 : index} : () -> index
  %3 = "arith.constant"() {value = 2 : index} : () -> index
  %4 = "arith.constant"() {value = 1 : i64} : () -> i64
  "llvm.br"(%1)[^bb1] : (i64) -> ()
  "cf.br"(%0)[^bb1] : (index) -> ()
^bb1(%5: index):  // 4 preds: ^bb0, ^bb0, ^bb2, ^bb2
  %6 = "arith.cmpi"(%5, %3) {predicate = 2 : i64} : (index, index) -> i1
  "llvm.cond_br"(%6)[^bb2, ^bb3] {operand_segment_sizes = dense<[1, 0, 0]> : vector<3xi32>} : (i1) -> ()
  "cf.cond_br"(%6)[^bb2, ^bb3] {operand_segment_sizes = dense<[1, 0, 0]> : vector<3xi32>} : (i1) -> ()
^bb2:  // 2 preds: ^bb1, ^bb1
  "memref.store"(%4, %arg0, %5) : (i64, memref<2xi64>, index) -> ()
  %7 = "arith.addi"(%5, %2) : (index, index) -> index
  %8 = "builtin.unrealized_conversion_cast"(%7) : (index) -> i64
  "llvm.br"(%8)[^bb1] : (i64) -> ()
  "cf.br"(%7)[^bb1] : (index) -> ()
^bb3:  // 2 preds: ^bb1, ^bb1
  "func.return"() : () -> ()
}) {function_type = (memref<2xi64>) -> (), sym_name = "foo"} : () -> ()
```

Tested with commit a65afce731c2fa91effcfa5d4917d6ad90a28bf0.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNWFtvozoQ_jXJi5UITAjhIQ9p0pVW6mqPquq8RgZM4nPARrZp2vPrz4whBBK6vezLSikXMx5_nss34yYqe10_HTmpmDFksvTSfGbVrCieS3ghOROFIbnS5PsjSZW0TEghDyRhRqQkKVT6ryEnYY9EyIy_EKYPdcmlNXOCSrnWMFWlaa0NqSsliYVRIZ9VyqyAV5W7kYIfWCH-45qw3MIVxw5cct1JOWTzRCMoVRmS1RpxZIIVPLUI7Zlrg8JCovBPyZ8UXB4e_v7xxHUpJLNKP6gTx3mTYJvmk2ADvzvNZHr8WU3olqDweRRGgvvmpWQ2PW5k9shPWlg-oasJjRHIJLw7cs0n4Q7GjtZWBifQb_A7gE3qZJ6qEl6cNZvbrNLqH0AMr2C9BG5sGbI85VHgpzRnsc_zPM1ZmC1iP8qWLIs9RldJ7oFoWQiNegTO23Zbbl6sVsW3Qp2elNvGyNg8rWCbwcNqAfgbB6WsNpwYzktDrCIJJ0ySWmru3JH17ZoyY8ExzJITM2fvgAi8DOdYCAJuCVgNbI1jzonzibebeJvmikvnqgBk6ET-wsqq4BhiuSgKHGLEwA3GwMwlLzUHb23pi1gu0CtgehdzGCbPrKidmA9_aP7eMjjifs5wbqhUWY1qo7vmnZC8limZLLxcKefZEOCjInK7Lo37EwkB4RSiINhB3AMe8LY0lklLcHDTpMRQ2h-T9t-SpmPS9E3de4D5C_2wh07e5RLE732S-M2u0z5mCO9WtC_iDQQC_OpiHSBVmmcY_I28h8nknugA4mD3ZSWIKawTRd3NPR3dHsCF3WR7xAxqeurPT8EAMO2jQ2wdNP-itPHv3AAv8IsBWxwuCMI7hyzckfF46O-t7yuWZWKwqVEP3_qAvu2C4CM70tzWWnbzol2bBt3DOR9aEavF4QDp7RKp4erTkUuia-lYvs2cmaosmc0aLrCzS4Vw6Tpr7QjbcWnWz8LgflQk2ETwF-IW3Kr4YF8rTkphHNm6ipMkXTmBjQcelgFTpyk3Rmk38oV4duZsXt5BJhVQPdyBHAnUL40wVNWWJGd9StEIWJQobRb1cSWImgZHGzfwycVVTGZokLZ8XLFhgewKBJjVZUXALUcLZJxjZPIXYdEZjvGAaRs_CfM-17XRMqGb5of6d6h_44rsX8zCTZJNVRWirced7FkDRXqc4-W8ydjt4EyD53x_jzg7tC5ZGtIEjUOm6i0R3bXEDnJ9T0adTTuDDtKqYxnQldSiANPNL7Vpf6lne6xnneM8t2jrrDZkWu0X2uyy_KPA_c8BDz6lnH5O-eIryGHvY6r7JvntHHBKmt6u741RFQPPDBKpl_nhW2Vq8WaZ8kYqCu0Zb3llPKhdHdiwJfmgNSKugek08NLAkC22LbmKNP_aqm3N65Za9uzSL31ooejOkRNMMPyAnLk3EPHGgci4NMBlW5jraqfXXKBtRTMCqGfoSJGGt8GLCChmbA-t_0u3_ckYb3uB607l0kr0jd_vDLqNDTqD5jHss0bTOoxw37Wfr60YRsPowu7hJrroLUHdxM9Vxq--wIPRx3jwJulXv5_00deSPvi8e11Ja3ulC_1dkdxgIWigmuTGqVgo965daey7Gj0o9JUACPNa7iUrz3OoO23QMXYdLDxs2Np2gRs8d7l-AM6XpbDko2fI-TRbB1kcxGxqhS34Ggz-4-H7I5r7cp4kuVYltFR4InRt3vmUfflvwLvn_2mti_Wnj8TCmJobeAjDwPOnx7XH2cqLfLaiySoOWJr53mLJk5DylZ8Fi3BasIQXZu1adSr5iTgVaNpwNxVr6lHqhd7Si714Ec8zloWrZRhG8WrBwjCGYx8vYVNzF89KH6Z67SAl9cHAx0IYay4fmTHiILkzG-pntT0qvQZCE5meupXXDvn__gjQbA">