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; + } + } + } + return false; +} + /* Expand code to perform a call under the AIX or ELFv2 ABI. */ void @@ -33002,7 +33024,9 @@ rs6000_call_aix (rtx value, rtx func_desc, rtx fla originally direct, the 3rd word has not been written since no trampoline has been built, so we ought not to load it, lest we override a static chain value. */ - if (!direct_call_p && TARGET_POINTERS_TO_NESTED_FUNCTIONS) + if (!direct_call_p + && TARGET_POINTERS_TO_NESTED_FUNCTIONS + && !chain_already_loaded (crtl->emit.sequence_stack->last)) { rtx sc_reg = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM); rtx func_sc_offset = GEN_INT (2 * GET_MODE_SIZE (Pmode)); -- Alan Modra Australia Development Lab, IBM