http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45722
--- Comment #28 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2010-11-12 11:20:12 UTC --- AFAICS Dave's analysis still holds. The problematic insn is (insn 88 87 89 5 (set (reg:DI 134 [ x$l ]) (mem/c:DI (reg/f:SI 185) [0 MEM[(struct E *)&sE]+0 S8 A8])) pr45722.c:50 -1 (nil)) (gdb) frame 1 #1 0x00000000007678ff in expand_assignment (to=0x7ffff7fbfcb8, from=0x7ffff7107000, nontemporal=0 '\000') at /home/eric/svn/gcc/gcc/expr.c:4474 4474 result = store_expr (from, to_rtx, 0, nontemporal); (gdb) p debug_generic_expr(from) MEM[(struct E *)&sE] $9 = void (gdb) p debug_generic_expr(to) x$l_3 The we arrive in the MEM expander: align = MAX (TYPE_ALIGN (TREE_TYPE (exp)), get_object_alignment (exp, BIGGEST_ALIGNMENT)); op0 = expand_expr (base, NULL_RTX, VOIDmode, EXPAND_SUM); op0 = convert_memory_address_addr_space (address_mode, op0, as); if (!integer_zerop (TREE_OPERAND (exp, 1))) { rtx off = immed_double_int_const (mem_ref_offset (exp), address_mode); op0 = simplify_gen_binary (PLUS, address_mode, op0, off); } op0 = memory_address_addr_space (mode, op0, as); temp = gen_rtx_MEM (mode, op0); set_mem_attributes (temp, exp, 0); set_mem_addr_space (temp, as); (gdb) p align $21 = 64 (gdb) p debug_rtx(temp) (mem/c:DI (reg/f:SI 185) [0 MEM[(struct E *)&sE]+0 S8 A8]) so it's exactly the situation described in comment #16.