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 20:59:01 +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>
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