At IR level gc.relocate is used to express new value of GC pointer
which may have changed during call wrapped by statepoint (IR instructions
have only single def; gc.relocate is a workaround for this limitation).
But MachineInstruction can have multiple results (DEF registers),
so gc.relocate is not needed here - it is equal to the corresponding
STATEPOINT DEF operand (when GC pointers are lowered via VRegs).
This means that during lowering of gc.relocate which has uses outside
its basic block we can simply use virtual register exported by STATEPOINT
and not generate CopyFromRegs/CopyToRegs SDNodes which copy one virtual
register to another, producing redundant COPY instruction.
This is purely compile time optimization. On big methods it can
improve compile time up to 10%.
please use spaces...