Giving a closer look to patch 6/7, it doesn't quite look like I'd expect. We should be able to handle load-store-load-swizzle as well as constant-store-load-swizzle. I'd expect that we should be passing a (unsigned int) swizzle parameter to copy_propagation_transform_load() and its inferiors, which would be HLSL_SWIZZLE(X, Y, Z, W) for the current user.
For that matter, we could probably factor out creating an array of sources, e.g.
``` struct copy_propagation_value *values[4];
for (...) values[i] = copy_propagation_get_values(state, values, var, start + swizzled_component(swizzle, i)); ```
and then pass that array to copy_propagation_compute_*_replacement().