The location for the normalisation is debatable. Henri and I agreed spirv.c is probably the best place because these changes are intended to make emitting SPIR-V easier. It can also be argued that since the SM 6 parser naturally emits in this form, except for one or two fixups, it's not all that related to SPIR-V.
Right, we may change our mind about this at some point in the future. For the moment though, one of the main considerations is that we'd like to preserve the original structure long enough for the d3d-asm target to be able to output it.
I feel like trying to accommodate the assembler (and disassembler) in vkd3d_shader_instruction is going to be a losing proposition at some point, but in this case it at least doesn't seem right that it's in spirv.c; perhaps it could live in some "neutral" source file?