[mlir][spirv] Fix control of nested sibling constructs in the deserializer (#225920)
When the deserializer structurizes an outer loop or selection,
updateMergeInfo re-keys the blockMergeInfo entries of the nested
constructs from the old blocks to the cloned ones. It erases the old
entry first and then reads it->second.control through the erased
iterator. blockMergeInfo is a MapVector, so the erase shifts the next
entry into that slot and the nested construct is re-created with its
sibling's control.
With two sibling loops inside an outer loop, the first one marked
DontUnroll and the second Unroll, the round trip comes back with both
marked Unroll. Same thing for two sibling selections with Flatten and
DontFlatten. If the erased entry was the last one the read is past the
end of the vector.
Copy the control value out of the entry before erasing it, like loc
already is. Adds round-trip tests with two sibling loops and two sibling
selections.
Fixes #218853