From: amylaar Date: Wed, 25 Feb 2004 12:42:26 +0000 (+0000) Subject: * reload1.c (reload): Only spill eliminable register with multiple X-Git-Tag: upstream/4.9.2~72770 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fd11b6022fadd0ed9993f7bd3a8c8858f2be1ddd;p=platform%2Fupstream%2Flinaro-gcc.git * reload1.c (reload): Only spill eliminable register with multiple adjacent elimination alternatives if all alternatives fail. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78430 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec2d741..4405cd9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-02-25 J"orn Rennecke + + * reload1.c (reload): Only spill eliminable register with multiple + adjacent elimination alternatives if all alternatives fail. + 2004-02-25 Richard Earnshaw * arm.c (arm_legitimate_index_p): For QImode the range of an offset diff --git a/gcc/reload1.c b/gcc/reload1.c index 1f21e48..12451db 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -849,9 +849,22 @@ reload (rtx first, int global) /* Spill any hard regs that we know we can't eliminate. */ CLEAR_HARD_REG_SET (used_spill_regs); - for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++) - if (! ep->can_eliminate) - spill_hard_reg (ep->from, 1); + /* There can be multiple ways to eliminate a register; + they should be listed adjacently. + Elimination for any register fails only if all possible ways fail. */ + for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ) + { + int from = ep->from; + int can_eliminate = 0; + do + { + can_eliminate |= ep->can_eliminate; + ep++; + } + while (ep < ®_eliminate[NUM_ELIMINABLE_REGS] && ep->from == from); + if (! can_eliminate) + spill_hard_reg (from, 1); + } #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM if (frame_pointer_needed)