https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91605
--- Comment #2 from Bernd Edlinger <edlinger at gcc dot gnu.org> --- Hmm, for whatever reason the decl-align of the "to" is 256 bit normally but when -fpack-struct is used only 8 bit aligned, but it is a reg. The reason for the ICE is that the movmisalign optab is rightfully confused when it is invoked with reg + reg. I think the following should fix the ICE: Index: expr.c =================================================================== --- expr.c (revision 275063) +++ expr.c (working copy) @@ -5004,7 +5004,8 @@ expand_assignment (tree to, tree from, bool nontem || TREE_CODE (to) == TARGET_MEM_REF || DECL_P (to)) && mode != BLKmode - && (DECL_P (to) || !mem_ref_refers_to_non_mem_p (to)) + && (DECL_P (to) ? MEM_P (DECL_RTL (to)) + : !mem_ref_refers_to_non_mem_p (to)) && ((align = get_object_alignment (to)) < GET_MODE_ALIGNMENT (mode)) && (((icode = optab_handler (movmisalign_optab, mode))