It is a requirement in the sense that if the C code passes the aggregate parameter by value, the compiler is required to generate the assembler code to pass via the registers [1].
[1] inlining, calls to static functions and whole program optimization do give the compilers freedom to pick a different calling convention of course.
[1] inlining, calls to static functions and whole program optimization do give the compilers freedom to pick a different calling convention of course.