SameOperandsAndResultShape and SameOperandsAndResultElementType should make the custom verifier redundant.
This syntax is somewhat unprecedented, to have types intermixed with operands. I think I would prefer something like
gpu.memcpy %dst %src : type, type
We could be extra verbose and do
gpu.memcopy %src to %dst : type, type