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

    <tr>
        <th>Summary</th>
        <td>
            Different behaviour on lexicographical reordering of blocks
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir:core
      </td>
    </tr>

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

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

<pre>
    This MLIR code fails to compile,
```
func.func @multiply(%A: i64) -> i64 {
    %B = arith.addi %A, %A : i64
    %Zero = arith.constant 0 : i64
    %C = arith.cmpi eq, %B, %Zero : i64
    %C1 = arith.constant 1 : i1
    cf.cond_br %C, ^bb1, ^bb2

    ^bb1:
        %One = arith.constant 1 : i64
        cf.br ^bb3

    ^bb3:
        %Res = scf.if %C1 -> i64 {
            %Two = arith.constant 2 : i64
 %res = arith.addi %Two, %Two : i64
            scf.yield %res : i64
        } else {
            %One = arith.constant 3 : i64
 %res = arith.addi %One, %One : i64
            scf.yield %res : i64
        }
        return %Res: i64

    ^bb2:
 return %B: i64
}
```
with error:
```
$ mlir-opt test.mlir 
test.mlir:18:13: error: redefinition of SSA value '%One'
 %One = arith.constant 3 : i64
            ^
test.mlir:9:9: note: previously defined here
        %One = arith.constant 1 : i64
 ^
```

However if I move `^bb1` to be lexicographically after `^bb3`, the redefinition is no longer detected, and hence no error thrown.

For clarity, this code compiles without errors:
```
func.func @multiply(%A: i64) -> i64  {
    %B = arith.addi %A, %A : i64
    %Zero = arith.constant 0 : i64
    %C = arith.cmpi eq, %B, %Zero : i64
    %C1 = arith.constant 1 : i1
 cf.cond_br %C, ^bb1, ^bb2

    ^bb3:
        %Res = scf.if %C1 -> i64 {
            %Two = arith.constant 2 : i64
            %res = arith.addi %Two, %Two : i64
            scf.yield %res : i64
        } else {
            %One = arith.constant 3 : i64
            %res = arith.addi %One, %One : i64
            scf.yield %res : i64
 }
        return %Res: i64

    ^bb1:
        %One = arith.constant 1 : i64
        cf.br ^bb3

    ^bb2:
        return %B: i64
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVl2PozYU_TXOy9UgMJDAAw_JZKKu1Gql3XnqS2XsS3Dr2KltkubfVwYmX8u005mqUnc0wYDvOff4XjiGOSe3GrEi-Yrk6xnrfGtsdWDywNyR-ZbNaiNO1XMrHfz046cvwI1AaJhUDrwBbnZ7qZDQRxKvSbwk83j87y-bTvMoHIBk8a5TXu7VidCC0HxJ0iXIeUZoCQ8kfQrnQBarAQgAQGi-ApKugVnp24gJIaEH0sd-hBeGa8TPaM0ViBvtPNMe4snox-vQ3V4C_j6yr8Zx5JuAJlNpkiE2uYTyJsyKX2rbo3ra_Kmuk_MZHUt3YR_m06tbY9LPGv8i67XCMXXIGtjSyRzpVI4v6PocjjeRbMalTnfoCvV8nCw7vVNGaG5H_tuuPh_NWPGBaWI54S-IOklU4sI0EUkWa0Dl8FW1r9QxfavazxpHtQPTR9Xe3rDoO6vHXtxA7vpHL_27YFa3iBfyuzfzKH0LaK2xZ467CEIz2ClpH8zeg0fno3AFw-T5mqTLpAiH8CydCcGiwEZq6aXRYBr4-nUJB6Y6BEIXLwVcXMr8xoZcdzF_-lZKOf5AG49h3Fs8SNM5dYJeEApo0eJ7X6xz0vta9ccfzBEPaEE28Al25oAQAoaXeR4Hu6wRFP4hudlatm8lZ0qdgDUe7Tk0DSf0EXyLt1WUDrQBZfQWLQj0yD2KEMl0WJTmGOb7DoBvrTnq6FrcxljgKqzvNNBLN3j5aOEOwiNhOj9QuNcei39q6d-dp7_X0P97s70F_Y989y3C_x0Lfr_3fmB_JnH5t1sz_Yb-7Q4_E1UqyrRkM6ySeVnki5wWxaytGlrmBa2TPMtSRpHXDRd1iUnMRLaYCz6TFY1pmsS0TGJaxEWUJDnWPOaYIRes5iSLccekipQ67CJjtzPpXIfVIs6LcqZYjcr135KUjpbMjUVCafi4tFVAPdTd1pEsVtJ5d-Hx0ius1rJp0KL2UGPLgnVbMPreNMGisQKt1NuwudTK8N_crLOqar3f99ZFN4RuttK3XR1xsyN0EzKNw8Peml-Re0I3vXxH6KZfwZ8BAAD__6jg9hg">