From d21fa493f8df619b85f15c6306caf099c416569f Mon Sep 17 00:00:00 2001 From: rsandifo Date: Sun, 26 Aug 2012 19:22:59 +0000 Subject: [PATCH] gcc/ * config/mips/mips.c (mips_has_long_branch_p): New function, split out from... (mips_expand_ghost_gp_insns): ...here. Look inside sequences. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190701 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/mips/mips.c | 46 +++++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7277a9af370..f462c9b3f4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2012-08-26 Richard Sandiford + * config/mips/mips.c (mips_has_long_branch_p): New function, + split out from... + (mips_expand_ghost_gp_insns): ...here. Look inside sequences. + +2012-08-26 Richard Sandiford + * config/mips/mips.c (r10k_safe_mem_expr_p): Use get_inner_reference. 2012-08-26 Richard Sandiford diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 3a19f44a48f..0763f228c42 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -15478,23 +15478,15 @@ mips_reorg_process_insns (void) htab_delete (htab); } -/* If we are using a GOT, but have not decided to use a global pointer yet, - see whether we need one to implement long branches. Convert the ghost - global-pointer instructions into real ones if so. */ +/* Return true if the function has a long branch instruction. */ static bool -mips_expand_ghost_gp_insns (void) +mips_has_long_branch_p (void) { - rtx insn; + rtx insn, subinsn; int normal_length; - /* Quick exit if we already know that we will or won't need a - global pointer. */ - if (!TARGET_USE_GOT - || cfun->machine->global_pointer == INVALID_REGNUM - || mips_must_initialize_gp_p ()) - return false; - + /* We need up-to-date instruction lengths. */ shorten_branches (get_insns ()); /* Look for a branch that is longer than normal. The normal length for @@ -15503,12 +15495,32 @@ mips_expand_ghost_gp_insns (void) but they have no delay slot. */ normal_length = (TARGET_MIPS16 ? 4 : 8); for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) - if (JUMP_P (insn) - && USEFUL_INSN_P (insn) - && get_attr_length (insn) > normal_length) - break; + FOR_EACH_SUBINSN (subinsn, insn) + if (JUMP_P (subinsn) + && USEFUL_INSN_P (subinsn) + && get_attr_length (subinsn) > normal_length + && (any_condjump_p (subinsn) || any_uncondjump_p (subinsn))) + return true; + + return false; +} + +/* If we are using a GOT, but have not decided to use a global pointer yet, + see whether we need one to implement long branches. Convert the ghost + global-pointer instructions into real ones if so. */ + +static bool +mips_expand_ghost_gp_insns (void) +{ + /* Quick exit if we already know that we will or won't need a + global pointer. */ + if (!TARGET_USE_GOT + || cfun->machine->global_pointer == INVALID_REGNUM + || mips_must_initialize_gp_p ()) + return false; - if (insn == NULL_RTX) + /* Run a full check for long branches. */ + if (!mips_has_long_branch_p ()) return false; /* We've now established that we need $gp. */ -- 2.11.4.GIT