Disclaimer: This turned out to be pretty much a copy of Jonas Paulsons patch http://reviews.llvm.org/D20531 just with a different motivation / comments... Uploading for reference.
By default MachineCopyPropagation only removes copies between values
that are identical anyway. This patch adds support for the classical
variant of copy propagation which transforms uses of a register:
%x = COPY %y use %x
is transformed to:
%x = COPY %y use %y
The transformation improves dependencies and gives the post register
allocation scheduler more freedom. It may also be better for out of
order execution engines that do not track copies.
The mode is opt-in because some targets have additional rules making
some register renames invalid.