This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Treat a sibling call as though it does a wild read


On Tue, Dec 23, 2014 at 3:55 PM, John David Anglin <dave.anglin@bell.net> wrote:
> On 23-Dec-14, at 5:37 PM, H.J. Lu wrote:
>
>> In this case,  arguments are passed in registers.  Isn't the optimization
>> disabled for ia32, which passes arguments on stack, even before your
>> change?
>
>
> It's not disabled in dse.c.  Possibly, this occurs for some cases for ia32
> in ix86_function_ok_for_sibcall.
>
> The problem in dse is in how to distinguish stores used for arguments from
> those used for general
> manipulation of data.  It seems the argument data for the call to bar in the
> testcase are copied through
> frame memory on x86_64.
>
> We have two situations:
>
>   /* This field is only used for the processing of const functions.
>      These functions cannot read memory, but they can read the stack
>      because that is where they may get their parms.  We need to be
>      this conservative because, like the store motion pass, we don't
>      consider CALL_INSN_FUNCTION_USAGE when processing call insns.
>      Moreover, we need to distinguish two cases:
>      1. Before reload (register elimination), the stores related to
>         outgoing arguments are stack pointer based and thus deemed
>         of non-constant base in this pass.  This requires special
>         handling but also means that the frame pointer based stores
>         need not be killed upon encountering a const function call.
>      2. After reload, the stores related to outgoing arguments can be
>         either stack pointer or hard frame pointer based.  This means
>         that we have no other choice than also killing all the frame
>         pointer based stores upon encountering a const function call.
>      This field is set after reload for const function calls.  Having
>      this set is less severe than a wild read, it just means that all
>      the frame related stores are killed rather than all the stores.  */
>   bool frame_read;
>
> Case 1 is incorrect for sibling calls as the call arguments are frame or
> argument pointer based
> when they are not passed in registers.
>
> When we don't have a const function, dse assumes:
>
>         /* Every other call, including pure functions, may read any memory
>            that is not relative to the frame.  */
>         add_non_frame_wild_read (bb_info);
>
> Again, this is incorrect for sibling calls (i.e., dse in general assumes
> that call arguments are register
> or stack pointer based before reload).
>

This optimization is done on purpose to fix:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44194

Unless it is also incorrect for x86, why not only disable it for
your target without penalizing x86 through a target hook.

Thanks.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]