<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/217895>217895</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MLIR][SparseTensor] `--sparsifier` produces invalid IR for `scf` nested in `affine.for`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir:sparsetensor,
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zxt5
</td>
</tr>
</table>
<pre>
## Reproducer
### small.mlir
```mlir
func.func @f(%c: i1) -> i64 {
%z = arith.constant 0 : i64
%one = arith.constant 1 : i64
%r = affine.for %i = 0 to 4 iter_args(%acc = %z) -> i64 {
%v = scf.if %c -> i64 {
%s = arith.addi %acc, %one : i64
scf.yield %s : i64
} else {
scf.yield %acc : i64
}
affine.yield %v : i64
}
return %r : i64
}
```
### To reproduce:
```
mlir-opt small.mlir -o /dev/null # parses and verifies
```
```
mlir-opt small.mlir --sparsifier -o /dev/null
```
### Crash:
```
small.mlir:4:8: error: 'affine.for' op expects region #0 to have 0 or 1 blocks
%r = affine.for %i = 0 to 4 iter_args(%acc = %z) -> i64 {
^
small.mlir:4:8: note: see current operation:
%2 = "affine.for"(%0) <{lowerBoundMap = affine_map<() -> (0)>, operandSegmentSizes = array<i32: 0, 0, 1>, step = 1 : index, upperBoundMap = affine_map<() -> (4)>}> ({
^bb0(%arg1: index, %arg2: i64):
"cf.cond_br"(%arg0)[^bb1, ^bb2] <{operandSegmentSizes = array<i32: 1, 0, 0>}> : (i1) -> ()
^bb1: // pred: ^bb0
%3 = "arith.addi"(%arg2, %1) <{overflowFlags = #arith.overflow<none>}> : (i64, i64) -> i64
"cf.br"(%3)[^bb3] : (i64) -> ()
^bb2: // pred: ^bb0
"cf.br"(%arg2)[^bb3] : (i64) -> ()
^bb3(%4: i64): // 2 preds: ^bb1, ^bb2
"cf.br"()[^bb4] : () -> ()
^bb4: // pred: ^bb3
"affine.yield"(%4) : (i64) -> ()
}) : (i64) -> i64
```
### The ordering matters:
```
mlir-opt small.mlir --lower-affine --convert-scf-to-cf -o /dev/null # fine
```
```
mlir-opt small.mlir --convert-scf-to-cf --lower-affine -o /dev/null # same error
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VsFy4jgQ_Rpx6TIlSzaGA4cEQtVU7Vxm5p6S7bbRrpFckswk-fotyTI4CclsDpuiCEiv-71-arcQ1spWIW5Jfk_y_UIM7qjN9uXJ5YtS189bQu_ii3HCOPzA3uh6qNDMl_2OPYmuW546GXZWdHzF782gqqV_A5LRhrA1YXlF-B3IlLANJIQ_gFxlQIp7Qu8ACMtfgPA9CCPdcVlpZZ1QDiiEoFU2obTCW7j0Lc6MqKaRCpeNNn5NhjUKTkMG0qF5FKa1ozhRVWHXC7mpMGQ9B4ytmqVs_PfqFi4g7UylqGsJIwdhu2sVV8H-z2d9ltjVU_h8mxR7wM7iRPMKPGp_A4-fogMX7Pm1URFn0A1GTb5N--Pu5WjfNsAvDWbqDsKntpmhfS8kunezVoFEA2GHGs-EHdTQdeAz9cJYtCBUDWc0spFo3xL_KW1ifRIf-p7jsyJ2RtjjTfWz_uZ3GeF3a-8MGqP9AhBWXLuLsAJ0D_jUY-UsGGyl9nby0GxHcUagoA2kUHa6-sf-j13qTz9_-FC_0s4fFlhEqAZjUDnQPRrhpFahLu9OziINm9fIRhHUMxO-I8V9p3-judeDqr-LflbL40n0HuHxUSVhax9I-IN_BgKlqn9ie0LlfsoXnB4YI54J30nOvBjqseEtjYHW4UgUn3hV45NfH_r-C0qyqKTYx4XRP5I_lCWNVps2fcUwrrHp8fAJfMt4k6rGT6L6sbyaJEwbyvVj9qEs05DBf2Ik30f3_qMJ6cUEOtMcWnA9G6djiVMVQbt_DAg7QG-wDgFjfbH5-OWML1NqLp_FotPrceszmqbTvw-daG2M5mP0tEX4TmmF74V6y3bRuUvfXv2bWcdnvvHRrWuKm8Wyz4t9xzBW90USPsZmrxrgwsoCr70Qzw989Pu1hgt5NiP_gDn7sDwey5tP-UuV2Xhwn5RV7D-AxPn_4eQ_ImhTo5GqhZNwDo2NM_SPczqMjGQUDElSaXVG4xJbNYnTSdW8vyEg3BEe_-VL4Ub2NwJuk1lxwjjq39mwqLe83vCNWOA2LdYFZ8VqTRfHLRO8qdabjHJRrNd5lZUCm6bGvBCYF7VYyC2jbEXXLE3zPMvosknLPNtkrGnKmq1SRjKKJyG7ZdedT0tt2oW0dsAtS4v1Jl90osTOhp9ujMXBHq49dKhsnNC7aY_5SbMwW58rKYfWkox20jp7ze6k68JPwe9_fftB8j3J73-GfL_GfL4zV3R-t5IVhXjlW5DqLDpZw7cfEO6uFbVV4xEKrcMapPJrsxtkRReD6bZH5_rQL6GjW-mOQ7ms9Imwg5cW_yW90X9j5Qg7BBcsYYdoxHnL_g0AAP__fxDp5A">