This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix PR64876, regressions in powerpc64 Go testsuite
- From: Alan Modra <amodra at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: David Edelsohn <dje dot gcc at gmail dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 5 Feb 2015 22:17:46 +1030
- Subject: Re: Fix PR64876, regressions in powerpc64 Go testsuite
- Authentication-results: sourceware.org; auth=none
- References: <20150203135735 dot GJ14796 at bubble dot grove dot modra dot org> <CAGWvnykygYkakPVTASG_UuGM=f7tXPSdnUzS-seMe=gB3EUqhQ at mail dot gmail dot com> <20150204001605 dot GL14796 at bubble dot grove dot modra dot org> <CAGWvnykMMtzV6n54cWsa16u53MiRLE1FNEKScvvagK_wv9qUww at mail dot gmail dot com> <20150205033954 dot GR14796 at bubble dot grove dot modra dot org> <20150205071225 dot GD1746 at tucnak dot redhat dot com> <20150205102901 dot GU14796 at bubble dot grove dot modra dot org> <20150205103153 dot GG1746 at tucnak dot redhat dot com>
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