On Thu, Feb 05, 2015 at 11:31:53AM +0100, Jakub Jelinek wrote:
> On Thu, Feb 05, 2015 at 08:59:01PM +1030, Alan Modra wrote:
> > On Thu, Feb 05, 2015 at 08:12:25AM +0100, Jakub Jelinek wrote:
> > > On Thu, Feb 05, 2015 at 02:09:54PM +1030, Alan Modra wrote:
> > > > Jakub, was your suggestion to use get_last_insn_anywhere() based on
> > > > not wanting to expose details that should be internal to
> > > > emit-rtl.[ch]?
> > >
> > > Yes. But if it doesn't work for what you want, either add a new accessor
> > > or
> > > use it directly.
> >
> > Thanks, I'll use it directly now and have a patch in the works to tidy
> > m32c.c and rs6000.c.
> >
> > David, here is the revised patch. Bootstrapped etc. powerpc64-linux,
> > and fixes a few more Go testsuite failures compared to the last one..
> >
> > PR target/64876
> > * config/rs6000/rs6000.c (chain_already_loaded): New function.
> > (rs6000_call_aix): Use it.
> >
> > Index: gcc/config/rs6000/rs6000.c
> > ===================================================================
> > --- gcc/config/rs6000/rs6000.c (revision 220433)
> > +++ gcc/config/rs6000/rs6000.c (working copy)
> > @@ -32919,7 +32919,29 @@ rs6000_legitimate_constant_p (machine_mode mode, r
> > }
> >
> >
> > +/* Return TRUE iff the sequence ending in LAST sets the static chain. */
> >
> > +static bool
> > +chain_already_loaded (rtx_insn *last)
> > +{
> > + for (; last != NULL; last = PREV_INSN (last))
> > + {
> > + if (NONJUMP_INSN_P (last))
> > + {
> > + rtx patt = PATTERN (last);
> > +
> > + if (GET_CODE (patt) == SET)
> > + {
> > + rtx lhs = XEXP (patt, 0);
> > +
> > + if (REG_P (lhs) && REGNO (lhs) == STATIC_CHAIN_REGNUM)
> > + return true;
> > + }
>
> Shouldn't you stop at CALL_INSNs? I mean in that case it would load the
> static chain for the other call and not the current one.
> Or do you have some guarantee that is in yet another sequence?
Yes, it is in another sequence.
rs6000_aix_call is guaranteed to be inside a GEN_CALL or GEN_CALL_VALUE,
so chain_already_loaded is guaranteed to be looking at rtl generated by
calls.c:emit_call_1. emit_call_1 is called from expand_call and
emit_library_call{,value} via emit_library_call_value_1. So far as I
know, we won't be calling library functions via an indirect call, so
chain_already_loaded will only be hit for the expand_call case.
expand_call uses start_sequence, which means we have rtl for the call
nicely isolated from other call rtl (except libcalls maybe, not sure
if that still happens).
--
Alan Modra
Australia Development Lab, IBM