From 620b72bc9149f1987caf53b4ea7667670721ecbc Mon Sep 17 00:00:00 2001 From: "Herman A.J. ten Brugge" Date: Fri, 6 Aug 1999 23:58:29 -0600 Subject: [PATCH] * reg-stack.c (change_stack) Fixed problem with negative array index. From-SVN: r28571 --- gcc/ChangeLog | 4 ++++ gcc/reg-stack.c | 53 ++++++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0d298ca8a8d..235088269455 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +1999-08-6 Herman A.J. ten Brugge + + * reg-stack.c (change_stack) Fixed problem with negative array index. + Fri Aug 6 20:41:08 1999 Jeffrey A Law (law@cygnus.com) Mon Jul 19 15:09:29 1999 David Edelsohn diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 8a27b9563b62..dd4a87e697cd 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -2640,43 +2640,46 @@ change_stack (insn, old, new, when) if (old->top != new->top) abort (); - /* Loop here emitting swaps until the stack is correct. The - worst case number of swaps emitted is N + 2, where N is the + /* If the stack is not empty (new->top != -1), loop here emitting + swaps until the stack is correct. + + The worst case number of swaps emitted is N + 2, where N is the depth of the stack. In some cases, the reg at the top of stack may be correct, but swapped anyway in order to fix other regs. But since we never swap any other reg away from its correct slot, this algorithm will converge. */ - do - { - /* Swap the reg at top of stack into the position it is - supposed to be in, until the correct top of stack appears. */ + if (new->top != -1) + do + { + /* Swap the reg at top of stack into the position it is + supposed to be in, until the correct top of stack appears. */ - while (old->reg[old->top] != new->reg[new->top]) - { - for (reg = new->top; reg >= 0; reg--) - if (new->reg[reg] == old->reg[old->top]) - break; + while (old->reg[old->top] != new->reg[new->top]) + { + for (reg = new->top; reg >= 0; reg--) + if (new->reg[reg] == old->reg[old->top]) + break; - if (reg == -1) - abort (); + if (reg == -1) + abort (); - emit_swap_insn (insn, old, - FP_MODE_REG (old->reg[reg], DFmode)); - } + emit_swap_insn (insn, old, + FP_MODE_REG (old->reg[reg], DFmode)); + } - /* See if any regs remain incorrect. If so, bring an + /* See if any regs remain incorrect. If so, bring an incorrect reg to the top of stack, and let the while loop above fix it. */ - for (reg = new->top; reg >= 0; reg--) - if (new->reg[reg] != old->reg[reg]) - { - emit_swap_insn (insn, old, - FP_MODE_REG (old->reg[reg], DFmode)); - break; - } - } while (reg >= 0); + for (reg = new->top; reg >= 0; reg--) + if (new->reg[reg] != old->reg[reg]) + { + emit_swap_insn (insn, old, + FP_MODE_REG (old->reg[reg], DFmode)); + break; + } + } while (reg >= 0); /* At this point there must be no differences. */ -- 2.47.2