locate_and_pad_parm has where_pad = FUNCTION_ARG_PADDING (passed_mode, type); boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type); locate->where_pad = where_pad; locate->boundary = boundary;
/* Remember if the outgoing parameter requires extra alignment on the calling function side. */ if (boundary > PREFERRED_STACK_BOUNDARY) boundary = PREFERRED_STACK_BOUNDARY; When boundary > PREFERRED_STACK_BOUNDARY, boundary is capped to PREFERRED_STACK_BOUNDARY. But locate->boundary has the wrong value. The following patch should correct this: Index: function.c =================================================================== --- function.c (revision 137896) +++ function.c (working copy) @@ -3258,13 +3258,13 @@ locate_and_pad_parm (enum machine_mode p = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode)); where_pad = FUNCTION_ARG_PADDING (passed_mode, type); boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type); + if (boundary > PREFERRED_STACK_BOUNDARY) + boundary = PREFERRED_STACK_BOUNDARY; locate->where_pad = where_pad; locate->boundary = boundary; /* Remember if the outgoing parameter requires extra alignment on the calling function side. */ - if (boundary > PREFERRED_STACK_BOUNDARY) - boundary = PREFERRED_STACK_BOUNDARY; if (crtl->stack_alignment_needed < boundary) crtl->stack_alignment_needed = boundary; -- Summary: Incorrect alignment attribute on stack parameter Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hjl dot tools at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36858