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

    <tr>
        <th>Summary</th>
        <td>
            mlir deserialize spirv: "Cannot destroy a value that still has uses!"
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          alex-s168
      </td>
    </tr>
</table>

<pre>
    On LLVM `d81ffd4ebb45` (latest main at time of writing)

`mlir-translate --deserialize-spirv` on the input below causes an error error:

```spirv
; SPIR-V
; Version: 1.0
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 14
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %2 "main"
 OpExecutionMode %2 OriginLowerLeft
       %void = OpTypeVoid
          %4 = OpTypeFunction %void
       %bool = OpTypeBool
      %false = OpConstantFalse %bool
          %2 = OpFunction %void None %4
          %7 = OpLabel
               OpBranch %8
          %9 = OpLabel
 OpSelectionMerge %10 None
               OpBranchConditional %false %11 %11
         %11 = OpLabel
               OpBranch %12
         %12 = OpLabel
               OpBranch %10
         %13 = OpLabel
 OpBranch %12
         %10 = OpLabel
               OpBranch %8
 %8 = OpLabel
               OpReturn
 OpFunctionEnd
```
(this was produced by using `spirv-reduce` on an `glslang` compiled OGL fragment shader)

error (minimized):
```
mlir-translate: mlir/include/mlir/IR/UseDefLists.h:198: mlir::IRObjectWithUseList<mlir::BlockOperand>::~IRObjectWithUseList() [OperandType = mlir::BlockOperand]: Assertion `use_empty() && "Cannot destroy a value that still has uses!"' failed.
Stack dump:
...
#12 mlir::Block::erase() Block.cpp:0:0
#13 mlir::spirv::Deserializer::structurizeControlFlow() Deserializer.cpp:0:0
#14 mlir::spirv::Deserializer::processFunctionEnd(llvm::ArrayRef<unsigned int>) Deserializer.cpp:0:0
#15 mlir::spirv::Deserializer::processFunction(llvm::ArrayRef<unsigned int>) Deserializer.cpp:0:0
#16  mlir::spirv::Deserializer::deserialize() Deserializer.cpp:0:0
#17  mlir::spirv::deserialize(llvm::ArrayRef<unsigned int>, mlir::MLIRContext*, mlir::spirv::DeserializationOptions const&) Deserialization.cpp:0:0
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVt9zmzgQ_mvklx0zIMCGBz_YTtzJnHPuJG3u8UbA2ugqJEYSSd2H-9tvFnDq-JJr2rmMg_Huft_-EPqEcE4eNOKCpSuWXk1E52tjF0Lh16mLZtmkMNVxsdOw3T7cApuFVRbt91WCRZGkbBYC45kSHp2HRkgNwoOXDYLZw5OVXuoD4zkLl_SZhY2Sduqt0I4wMJ1W6NBKoeQ3nLpW2keiNBp8jSB123koUJknKEXn0IHQgNYaO1xZvHxmHj4DRbhk8QruP97cTR_GHw9onTSaxUuIgnA0fkCNVvieCH6rrdHGjTD4ZIxysHQOm0KhpfATbGU6XfVMySlVWWMjyEQx8PJv165FKwqppD_CfS0qtC-CGE8jYPEV7Nrrr_5GO3_TtMZ6YJx_2N5vA-erIElDxvlr5LfYGHu8NRUq2JqDLIUCghHilfBr7e3xo5Haw8aKQ4OaEqWcstECjlmoFiw7L40m6iFkZ-VB6q15QrvFvf9Oz3j6aGQ1dvHp2OKDkdVll8mZf9PpkshP0BdchTHqLHZljHr2M57uhXI4-tdGOy-03wy2AXuZmI_Bl0nhd6N7UHKJmI-IrShQvTbGlRW6rCk0u8Tml9hde48K-8y3aA99xijsk79NvTa6kgQR6qxnnkbRcD1Hjub3VhzxSzD_CXB4CY7_3e9_5Qp_crT0_SPIHfrO6iH3aZGvdXWuDHTPM19LB0_CQWtN1ZVYQXGEzkl9gJN6TC2SZ9QhoclxUE4JfSBbaZpWKqxg92EL-9MOcsO2PindoFGMZ43UspHfsCJXvLwo6KUaknyQhfGN1KXqKmR8Mxpu7hjffHZ4hfutdN4FNYuXUZ49Y-Ili5c3d7viLyz9H9LXnx1SJIvX3_0rZcovuxatIP26Hox_v4biGeM5sHQ1RtM27BfhDbL0iiohtbTDBpuFncM_sWn98UTGZ4zPSGbWQmvjoULnrTmCgEehOgRfCw_OS6WgFg5I7xmPSI_4HPaChh6wcHnvRfkFqq5ph4EGQdCvbRzxy-qGW7TC4VhEbw7KlrBh_z9A4zPocIb0t1ffT6eT09uu9J2V33BttLdGbZR5GtnPw19Jkrw3SWtNic6dP8k8U-qxGdxLa8XxDvcsXne6P70rkNrTiv64iPQXi_j_KpjBe0s4ezl434Tnb1C_JHpfH-szqtvtzR0tN371jC9f-l7tQNDIdi1dHZR0RvWP_3kDfchlDydxmFSLuMrjXExwEc1nYRzyeZRO6sW8yLN9OtuLPORcRFFCvizLyzKsBAoxkQsekspGnIdpFqdBkmZhkhfFPBLzPE0yloTYCKkCGkNg7GEinetwEc3iMM8nijTW9W-DnA_qw-m90C4oflp0B8eSUPUi9MzgpVe4oGg4GzWcRvMrm37SWbWovW8dzZZvGN8cpK-7IihNw_imX8Tha9paQwJGwkmtOMY3YzePC_5PAAAA__9eazmK">