diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2010-06-17 21:51:55 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2010-06-17 21:51:55 +0000 |
commit | 60de8907d1ad3bb0c8f5943133a4af2702259b70 (patch) | |
tree | f547304e22d7c081d8d210454f60cf572f474b9d /gcc | |
parent | d398d9033ab546ac985784ed07051b3f22126d91 (diff) | |
download | gcc-60de8907d1ad3bb0c8f5943133a4af2702259b70.zip gcc-60de8907d1ad3bb0c8f5943133a4af2702259b70.tar.gz gcc-60de8907d1ad3bb0c8f5943133a4af2702259b70.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ira.c | 8 | ||||
-rw-r--r-- | gcc/reload1.c | 12 |
3 files changed, 15 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f68d673..78dfa04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-06-17 Bernd Schmidt <bernds@codesourcery.com> + + 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 <gnikl@users.sourceforge.net> * config/rs6000/rs6000.c (print_operand) <'K'>: Also use @@ -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 f3d61c6..00d4c99 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; } |