--- /dev/null
+--- gcc/gcc/builtins.c (revision 113409)
++++ gcc/gcc/builtins.c (revision 113410)
+@@ -275,14 +275,28 @@
+ case ADDR_EXPR:
+ /* See what we are pointing at and look at its alignment. */
+ exp = TREE_OPERAND (exp, 0);
++ inner = max_align;
++ while (handled_component_p (exp))
++ {
++ /* Fields in a structure can be packed, honour DECL_ALIGN
++ of the FIELD_DECL. For all other references the conservative
++ alignment is the element type alignment. */
++ if (TREE_CODE (exp) == COMPONENT_REF)
++ inner = MIN (inner, DECL_ALIGN (TREE_OPERAND (exp, 1)));
++ else
++ inner = MIN (inner, TYPE_ALIGN (TREE_TYPE (exp)));
++ exp = TREE_OPERAND (exp, 0);
++ }
+ if (TREE_CODE (exp) == FUNCTION_DECL)
+ align = FUNCTION_BOUNDARY;
+ else if (DECL_P (exp))
+- align = DECL_ALIGN (exp);
++ align = MIN (inner, DECL_ALIGN (exp));
+ #ifdef CONSTANT_ALIGNMENT
+ else if (CONSTANT_CLASS_P (exp))
+- align = CONSTANT_ALIGNMENT (exp, align);
++ align = MIN (inner, (unsigned)CONSTANT_ALIGNMENT (exp, align));
+ #endif
++ else
++ align = MIN (align, inner);
+ return MIN (align, max_align);
+
+ default: