> Hi, > this is improved patch I am testing. The basic idea is to remove push > expanders for cases where we do not have push instruction anyway. > emit_move_insns then resorts to unconditonally call move expander > with push operand. I expended ix86_expand_vector_move to handle > it gracefully and for that I borrowed emit_move_resolve_push > function from expr.c since it seemed pointless to preserve > duplicated logic in ix86_expand_push. > > I can easily imagine that scheduling around function call sequences > matters, so I also updated push/pop expanders to preserve memory attributes. > > Eventually I found the attributes to be blank because of logic in expr.c > that clears alias info when sibcall is enabled. We can now do better > by only disabling it in functions that actually do sibcalls. > > Bootstrap/regtest running on x86_64-linux, OK for the non-i386 parts > if it passes?
Ping... > > Honza > > * expr.c (emit_move_resolve_push): Export; be bit more selective > on when to clear alias set. > * expr.h (emit_move_resolve_push): Declare. > * function.h (struct function): Add tail_call_marked. > * tree-tailcall.c (optimize_tail_call): Set tail_call_marked. > * config/i386/i386-protos.h (ix86_expand_push): Remove. > * config/i386/i386.md (TImode move expander): De not call > ix86_expand_push. > (FP push expanders): Preserve memory attributes. > * config/i386/sse.md (push<mode>1): Remove. > * config/i386/i386.c (ix86_expand_vector_move): Handle push > operation. > (ix86_expand_push): Remove. > * config/i386/mmx.md (push<mode>1): Remove.