From: Bernd Schmidt Date: Thu, 17 Jun 2010 21:51:55 +0000 (+0000) Subject: re PR rtl-optimization/39871 (Code size increase on ARM due to poor register allocation) X-Git-Tag: releases/gcc-4.6.0~6375 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60de8907d1ad3bb0c8f5943133a4af2702259b70;p=thirdparty%2Fgcc.git re PR rtl-optimization/39871 (Code size increase on ARM due to poor register allocation) PR rtl-optimization/39871 * reload1.c (init_eliminable_invariants): For flag_pic, disable equivalences only for constants that aren't LEGITIMATE_PIC_OPERAND_P. (function_invariant_p): Rule out a plus of frame or arg pointer with a SYMBOL_REF. * ira.c (find_reg_equiv_invariant_const): Likewise. From-SVN: r160947 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f68d673b2707..78dfa0413fd3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-06-17 Bernd Schmidt + + PR rtl-optimization/39871 + * reload1.c (init_eliminable_invariants): For flag_pic, disable + equivalences only for constants that aren't LEGITIMATE_PIC_OPERAND_P. + (function_invariant_p): Rule out a plus of frame or arg pointer with + a SYMBOL_REF. + * ira.c (find_reg_equiv_invariant_const): Likewise. + 2010-06-17 Gunther Nikl * config/rs6000/rs6000.c (print_operand) <'K'>: Also use diff --git a/gcc/ira.c b/gcc/ira.c index bd65d5471405..83a4358e4eb3 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -1586,12 +1586,8 @@ find_reg_equiv_invariant_const (void) x = XEXP (note, 0); - if (! function_invariant_p (x) - || ! flag_pic - /* A function invariant is often CONSTANT_P but may - include a register. We promise to only pass CONSTANT_P - objects to LEGITIMATE_PIC_OPERAND_P. */ - || (CONSTANT_P (x) && LEGITIMATE_PIC_OPERAND_P (x))) + if (! CONSTANT_P (x) + || ! flag_pic || LEGITIMATE_PIC_OPERAND_P (x)) { /* It can happen that a REG_EQUIV note contains a MEM that is not a legitimate memory operand. As later diff --git a/gcc/reload1.c b/gcc/reload1.c index f3d61c66a988..00d4c99b6c08 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -4151,13 +4151,9 @@ init_eliminable_invariants (rtx first, bool do_subregs) if (i <= LAST_VIRTUAL_REGISTER) continue; - if (! function_invariant_p (x) - || ! flag_pic - /* A function invariant is often CONSTANT_P but may - include a register. We promise to only pass - CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P. */ - || (CONSTANT_P (x) - && LEGITIMATE_PIC_OPERAND_P (x))) + /* If flag_pic and we have constant, verify it's legitimate. */ + if (!CONSTANT_P (x) + || !flag_pic || LEGITIMATE_PIC_OPERAND_P (x)) { /* It can happen that a REG_EQUIV note contains a MEM that is not a legitimate memory operand. As later @@ -6004,7 +6000,7 @@ function_invariant_p (const_rtx x) return 1; if (GET_CODE (x) == PLUS && (XEXP (x, 0) == frame_pointer_rtx || XEXP (x, 0) == arg_pointer_rtx) - && CONSTANT_P (XEXP (x, 1))) + && GET_CODE (XEXP (x, 1)) == CONST_INT) return 1; return 0; }