https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121784
--- Comment #4 from Heinrich Schuchardt <xypron.glpk at gmx dot de> --- Hello Andrew, Thank you for your analysis. I experimented a bit with the type of F in your reduced example. These fail: using F = __attribute__((vector_size(16))) double; using F = __attribute__((vector_size(16))) float; using F = __attribute__((vector_size(16))) short; using F = struct {float x0; float x1; float x2; float x3;}; using F = struct {float x0; float x1; float x2;}; These succeed: using F = __attribute__((vector_size(8))) double; using F = __attribute__((vector_size(8))) float; using F = __attribute__((vector_size(8))) short; using F = struct {float x0; float x1;}; I then tried with a higher count of arguments: using StageFn = void (*)(StageList list, int src, int dst, F r, F g, F b, F v, F w, F x, F y, F z); These fail: using F = __attribute__((vector_size(8))) double; using F = __attribute__((vector_size(8))) float; using F = __attribute__((vector_size(8))) short; using F = struct {double a; double b;}; These succeed: using F = double; using F = struct {float a; float b;}; It is weird that `__attribute__((vector_size(8))) double` differently than `double` and `__attribute__((vector_size(8))) float` differently than `struct {float a; float b;};`. With a lower count of arguments: using StageFn = void (*)(StageList list, F a); These fail: using F = __attribute__((vector_size(32))) double; using F = __attribute__((vector_size(32))) float; These succeed: using F = __attribute__((vector_size(16))) double; using F = __attribute__((vector_size(16))) float; Is the number of tail call arguments limited by available registers? According to the documentation in https://gcc.gnu.org/onlinedocs/gcc-15.2.0/gcc/Statement-Attributes.html the only differentiation should be between trivially destructible and non-trivially destructible arguments. If the arguments are passed by value, it should not matter if they are in registers or on the stack. Best regards Heinrich