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

Dave
--
John David Anglin       dave.ang...@bell.net



Reply via email to