ostannard added a comment. I've not looked at the code in detail yet, but I think this still gets the ABI wrong for this example:
typedef struct { __attribute__ ((__aligned__(32))) double v[4]; } TYPE1; double func(double d0, double d1, double d2, double d3, double d4, double d5, double d6, double d7, float stk0, TYPE1 stk1) { return stk1.v[0]; } The ABI says (https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst, rule B.5): If the argument is an alignment adjusted type its value is passed as a copy of the actual value. The copy will have an alignment defined as follows. * For a Fundamental Data Type, the alignment is the natural alignment of that type, after any promotions. * For a Composite Type, the alignment of the copy will have 8-byte alignment if its natural alignment is <= 8 and 16-byte alignment if its natural alignment is >= 16. The alignment of the copy is used for applying marshaling rules. This means that `stk1` should be passed as a copy with alignment 16 bytes, putting it at `sp+16`. GCC does this, clang without this patch passes it at `sp+8`, and clang with this patch passes it at `sp+32`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75903/new/ https://reviews.llvm.org/D75903 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits