HIP supports _Float16 and __fp16 types. In x86_64 host they are for storage
only. Since they have the same size and alignment as int16, they are supposed
to be passed by value in the same way as int16. Currently clang pass them
by stack when included in a struct, which is not efficient. This also causes
interoperability difficulty with gcc. On gcc since there is no _Float16 type,
int16 is used as replacement for _Float16 for passing arguments, which is
passed by register.
This patch changes x86_64 target codegen info so that _Float16 and __fp16
in structs can be passed by register.
It's true that AMD64 does not support _Float16, but __fp16 is supported on every target.
See https://clang.llvm.org/docs/LanguageExtensions.html#half-precision-floating-point