> > * config/i38/x86-tune.def: Disable X86_TUNE_ACCUMULATE_OUTGOING_ARGS > > for generic and recent AMD chips > > The ChangeLog reads: > > 2014-01-22 Jan Hubicka <j...@suse.cz> > > * config/i386/x86-tune.def (X86_TUNE_ACCUMULATE_OUTGOING_ARGS): > Enable for generic and recent AMD targets. > > Very confusing... Sorry, will fix it.
I looked into the movups. The problem here is that ix86_expand_push is not given a memory destination argument (because push expander is not) and it builds it by itself. The alignment then ends up being 8. I am not 100% sure if the following code is safe (if I change alignment in the testcase we end up using DImode push so it works). Perhaps we want to remove the push expanders and make ix86_expand_move to handle this case so we preserve other mem info too? Honza * i386.c (ix86_expand_push): Set alignment based on argument boundary. Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 206946) +++ config/i386/i386.c (working copy) @@ -17230,6 +17230,9 @@ ix86_expand_push (enum machine_mode mode, rtx x) { rtx tmp; + unsigned int align = ix86_function_arg_boundary (mode, NULL); + if (align > MAX_SUPPORTED_STACK_ALIGNMENT) + align = MAX_SUPPORTED_STACK_ALIGNMENT; tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx, GEN_INT (-GET_MODE_SIZE (mode)), @@ -17239,6 +17242,11 @@ tmp = gen_rtx_MEM (mode, stack_pointer_rtx); + /* We use push of non-integer parameters only to store function + arguments. */ + if (MEM_ALIGN (tmp) < align) + set_mem_align (tmp, align); + /* When we push an operand onto stack, it has to be aligned at least at the function argument boundary. However since we don't have the argument type, we can't determine the actual argument