As explained in the comments, matchSwap matches:
mov t, x
mov x, y
// mov y, t
and turns it into:
mov t, x (t is potentially dead and move eliminated)
v_swap_b32 x, y
On physical registers we don't have full use-def chains so the check
for T being live-out was not working properly with subregs/superregs.
Does this part make sense? I am really not too sure what kind of liveness information we can rely on here for virtual and/or physical registers.