diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/pa/pa.c | 67 |
2 files changed, 27 insertions, 46 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c22678..121a273 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-02 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + PR target/45820 + * config/pa/pa.c (pa_secondary_reload): Handle symbolic operands + earlier. + 2010-10-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * doc/install.texi (Configuration): Document build_configargs, diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 43da019..e114dd1 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -5762,7 +5762,7 @@ static reg_class_t pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, enum machine_mode mode, secondary_reload_info *sri) { - int is_symbolic, regno; + int regno; enum reg_class rclass = (enum reg_class) rclass_i; /* Handle the easy stuff first. */ @@ -5796,6 +5796,23 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, return NO_REGS; } + /* Secondary reloads of symbolic operands require %r1 as a scratch + register when we're generating PIC code and when the operand isn't + readonly. */ + if (symbolic_expression_p (x)) + { + if (GET_CODE (x) == HIGH) + x = XEXP (x, 0); + + if (flag_pic || !read_only_operand (x, VOIDmode)) + { + gcc_assert (mode == SImode || mode == DImode); + sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1 + : CODE_FOR_reload_indi_r1); + return NO_REGS; + } + } + /* Profiling showed the PA port spends about 1.3% of its compilation time in true_regnum from calls inside pa_secondary_reload_class. */ if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG) @@ -5858,51 +5875,9 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER && (REGNO_REG_CLASS (regno) == SHIFT_REGS && FP_REG_CLASS_P (rclass))) - { - sri->icode = (in_p - ? direct_optab_handler (reload_in_optab, mode) - : direct_optab_handler (reload_out_optab, mode)); - return NO_REGS; - } - - /* Secondary reloads of symbolic operands require %r1 as a scratch - register when we're generating PIC code and when the operand isn't - readonly. */ - if (GET_CODE (x) == HIGH) - x = XEXP (x, 0); - - /* Profiling has showed GCC spends about 2.6% of its compilation - time in symbolic_operand from calls inside pa_secondary_reload_class. - So, we use an inline copy to avoid useless work. */ - switch (GET_CODE (x)) - { - rtx op; - - case SYMBOL_REF: - is_symbolic = !SYMBOL_REF_TLS_MODEL (x); - break; - case LABEL_REF: - is_symbolic = 1; - break; - case CONST: - op = XEXP (x, 0); - is_symbolic = (GET_CODE (op) == PLUS - && ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF - && !SYMBOL_REF_TLS_MODEL (XEXP (op, 0))) - || GET_CODE (XEXP (op, 0)) == LABEL_REF) - && GET_CODE (XEXP (op, 1)) == CONST_INT); - break; - default: - is_symbolic = 0; - break; - } - - if (is_symbolic && (flag_pic || !read_only_operand (x, VOIDmode))) - { - gcc_assert (mode == SImode || mode == DImode); - sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1 - : CODE_FOR_reload_indi_r1); - } + sri->icode = (in_p + ? direct_optab_handler (reload_in_optab, mode) + : direct_optab_handler (reload_out_optab, mode)); return NO_REGS; } |