Rust folks, is there a reason rustc couldn't implement this kind of lowering? https://godbolt.org/z/8KbEGYY1s
That is, fn(Self, ...) -> Self would be lowered to fn(*mut Self, ...) to prevent copies. You could use an ABI-dependent lowering for different types so that fn(i32, ...) -> i32, etc, can still go through registers.