https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110044
--- Comment #6 from Iain Sandoe <iains at gcc dot gnu.org> --- I'm going to test the following (which will take some time since the hardware is needed for testing releases too). The test for AGGREGATE_TYPE_P() could actually be changed to RECORD_OR_UNION_TYPE_P () - since the case that we might have an array is handled for non-empty structs (but we do need to guard the empty struct case). The problem seems to be we were ignoring that the field type could be packed or that there was a cap on the max alignment. If it works as expected then I will apply to the open branches (hopefully before 10.5 is spun). ---- diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 5b3b8b52e7e..e1c038da305 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -8209,7 +8209,8 @@ darwin_rs6000_special_round_type_align (tree type, unsigned int computed, type = TREE_TYPE (type); } while (AGGREGATE_TYPE_P (type)); - if (! AGGREGATE_TYPE_P (type) && type != error_mark_node) + if (type != error_mark_node && ! AGGREGATE_TYPE_P (type) + ! TYPE_PACKED(type) && maximum_field_alignment == 0) align = MAX (align, TYPE_ALIGN (type)); return align;