I don't hate either version. I imagine that ultimately we may want to move to a scheme like this though:
if (program->cf_type == CF_TYPE_STRUCTURED) flatten_control_flow_constructs(program); [...]
where "cf_type" would originally be set by the parser. I.e., explicitly checking for properties of the vsir instead of having those be implied by the shader model or bytecode format.
Yes, that's my idea too. Relatedly, as was already discussed, I expect support for different dialects/flags to eventually appear in order to validate language features that do not necessarily hold at every step, but which are still worthwhile to check at every step where they should hold.