That's not how calling conventions work. On all ABIs we care about, the calling conventions allow struct components to be passed in registers.

Also, I don't see what you mean by devirtualization being necessary. This proposal reduces the need for devirtualization.

The LLVM attribute issue is a valid one, but this should be fixed in LLVM. The logical conclusion of working around this limitation in the language design leads to absurdities such as