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