On January 4, 2015 3:57:07 PM CET, "H.J. Lu" <hjl.to...@gmail.com> wrote: >On Sun, Jan 4, 2015 at 3:37 AM, Richard Biener ><richard.guent...@gmail.com> wrote: >> On January 3, 2015 10:48:47 PM CET, "H.J. Lu" <hjl.to...@gmail.com> >wrote: >>>On Sat, Jan 3, 2015 at 12:58 PM, John David Anglin >>><dave.ang...@bell.net> wrote: >>>> On 2015-01-03, at 3:18 PM, H.J. Lu wrote: >>>> >>>>> On Sat, Jan 3, 2015 at 12:10 PM, John David Anglin >>><dave.ang...@bell.net> wrote: >>>>>> On 2015-01-03, at 2:48 PM, H.J. Lu wrote: >>>>>> >>>>>>> On Sat, Jan 3, 2015 at 9:35 AM, John David Anglin >>>>>>> <d...@hiauly1.hia.nrc.ca> wrote: >>>>>>>> On Wed, 31 Dec 2014, H.J. Lu wrote: >>>>>>>> >>>>>>>>> - /* Arguments for a sibling call that are pushed to >memory >>>are passed >>>>>>>>> - using the incoming argument pointer of the current >>>function. These >>>>>>>>> - may or may not be frame related depending on the >target. >>>Since >>>>>>>>> - argument pointer related stores are not currently >>>tracked, we treat >>>>>>>>> - a sibling call as though it does a wild read. */ >>>>>>>>> - if (SIBLING_CALL_P (insn)) >>>>>>>>> + if (targetm.sibcall_wild_read_p (insn)) >>>>>>>>> { >>>>>>>>> add_wild_read (bb_info); >>>>>>>>> return; >>>>>>>> >>>>>>>> Instead of falling through to code designed to handle normal >>>calls, it >>>>>>>> would be better to treat them separately. Potentially, there >are >>>other >>>>>>>> optimizations that may be applicable. If a sibcall doesn't >read >>>from >>>>>>>> the frame, add_non_frame_wild_read() can be called. This would >>>restore >>>>>>>> the x86 optimization. >>>>>>>> >>>>>>> >>>>>>> That will a new optimization. I am trying to restore the old >>>behavior on >>>>>>> x86 with minimum impact in stage 3. >>>>>> >>>>>> >>>>>> Not really. In gcc.dg/pr44194-1.c, the sibcall was not a const >>>function and this case >>>>>> was covered by this hunk of code: >>>>>> >>>>>> else >>>>>> /* Every other call, including pure functions, may read >any >>>memory >>>>>> that is not relative to the frame. */ >>>>>> add_non_frame_wild_read (bb_info); >>>>>> >>>>> >>>>> Revision 219037 has >>>>> >>>>> diff --git a/gcc/dse.c b/gcc/dse.c >>>>> index 2555bd1..3a7f31c 100644 >>>>> --- a/gcc/dse.c >>>>> +++ b/gcc/dse.c >>>>> @@ -2483,6 +2483,17 @@ scan_insn (bb_info_t bb_info, rtx_insn >*insn) >>>>> >>>>> insn_info->cannot_delete = true; >>>>> >>>>> + /* Arguments for a sibling call that are pushed to memory >are >>>passed >>>>> + using the incoming argument pointer of the current function. >>>These >>>>> + may or may not be frame related depending on the target. >Since >>>>> + argument pointer related stores are not currently tracked, we >>>treat >>>>> + a sibling call as though it does a wild read. */ >>>>> + if (SIBLING_CALL_P (insn)) >>>>> + { >>>>> + add_wild_read (bb_info); >>>>> + return; >>>>> + } >>>>> + >>>>> /* Const functions cannot do anything bad i.e. read memory, >>>>> however, they can read their parameters which may have >>>>> been pushed onto the stack. >>>>> >>>>> My patch changes it to >>>>> >>>>> diff --git a/gcc/dse.c b/gcc/dse.c >>>>> index 2555bd1..c0e1a0c 100644 >>>>> --- a/gcc/dse.c >>>>> +++ b/gcc/dse.c >>>>> @@ -2483,6 +2483,12 @@ scan_insn (bb_info_t bb_info, rtx_insn >*insn) >>>>> >>>>> insn_info->cannot_delete = true; >>>>> >>>>> + if (targetm.sibcall_wild_read_p (insn)) >>>>> + { >>>>> + add_wild_read (bb_info); >>>>> + return; >>>>> + } >>>>> + >>>>> /* Const functions cannot do anything bad i.e. read memory, >>>>> however, they can read their parameters which may have >>>>> been pushed onto the stack. >>>>> >>>>> On x86, it is the same as before revision 219037 since >>>>> targetm.sibcall_wild_read_p always returns false on x86. >>>> >>>> >>>> Understood. The point is the subsequent code for const functions >is >>>based on assumptions that >>>> are not generally true for sibcalls: >>>> >>>> /* 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; >>>> >>>> For example, the stores related to sibcall arguments are not in >>>general stack pointer based. This >>>> suggests to me that we don't have to always kill stack pointer >based >>>stores in the const sibcall case >>>> and they can be optimized. >>>> >>>> For me, keeping the sibcall handling separate from normal calls is >>>easier to understand and >>>> potentially provides a means to optimize stack pointer based >stores. >>>Are you sure that the prior >>>> behaviour was always correct on x86 (e.g., more than 6 arguments)? >>>> >>> >>>I'd like to do it in 2 steps: >>> >>>1. Bring x86 back to the behavior prior to revision 21903 since it >>>won't >>>cause any regressions. >>>2. Investigate if sibcall is handled correctly on x86. >> >> But either your new hook or the original fix makes no sense. > >All I want is to restore the old behavior on x86. If the original fix >makes no sense, should it be reverted?
I think the original fix is too conservative But I also think there is a target independent bug, thus a target hook to "fix" things for x86 makes no sense. Richard.