Copy propagation is translated to index paths, invalidation of variable components is made more precise.
This, together with checking for non-static object references (which are not allowed in HLSL) allows to set object register sizes back to zero without overlapping registers.
I also included implicit array initialization, since, if I remember correctly, what was holding it back was that structs/arrays with object components couldn't be represented with the correct register offsets.
After this, we have to decide if (and how to) move register allocation and register offset calculation to each shader model.
-- v2: vkd3d-shader/hlsl: Support initialization of implicit size arrays. vkd3d-shader/hlsl: Set objects' register size back to 0. vkd3d-shader/hlsl: Check for non-static object references. vkd3d-shader/hlsl: Invalidate components more precisely in copy vkd3d-shader/hlsl: Replace register offsets with index paths in copy vkd3d-shader/hlsl: Print halfs in dump_ir_constant(). vkd3d-shader/hlsl: Skip implicit conversion if types are equal. vkd3d-shader/hlsl: Set component count for objects to 1. tests: Test object references. vkd3d-shader/hlsl: Emit a fixme on complex resource load object derefs. vkd3d-shader/hlsl: Rename 'inner_type' to 'element_type' in function