From 4ab51fb500e802efac59c1eb79f2ddb5029a9e69 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Wed, 25 Feb 2004 12:42:26 +0000 Subject: [PATCH] reload1.c (reload): Only spill eliminable register with multiple adjacent elimination alternatives... * reload1.c (reload): Only spill eliminable register with multiple adjacent elimination alternatives if all alternatives fail. From-SVN: r78430 --- gcc/ChangeLog | 5 +++++ gcc/reload1.c | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec2d741ac59f..4405cd971408 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 1f21e4800a6e..12451db1318e 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) -- 2.47.2