> 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.

Reply via email to