This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Unreviewed patch
On Wed, Mar 27, 2002 at 11:37:07PM -0700, Roger Sayle wrote:
> http://gcc.gnu.org/ml/gcc-patches/2002-01/msg00145.html
> Avoid emitting stack adjustments of zero bytes.
I've applied a slightly different version of the patch.
Primarily, don't mess around with pending_delete.
Tested on i386-linux.
r~
2002-03-30 Roger Sayle <roger@eyesopen.com>
Richard Henderson <rth@redhat.com>
* regmove.c (combine_stack_adjustments_for_block): Avoid
emitting a stack adjustment of zero bytes. Let delete_insn
update bb->head.
Index: regmove.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/regmove.c,v
retrieving revision 1.124
diff -c -p -d -r1.124 regmove.c
*** regmove.c 2002/02/19 11:39:01 1.124
--- regmove.c 2002/03/31 03:25:35
*************** combine_stack_adjustments_for_block (bb)
*** 2331,2349 ****
HOST_WIDE_INT last_sp_adjust = 0;
rtx last_sp_set = NULL_RTX;
struct csa_memlist *memlist = NULL;
! rtx pending_delete;
! rtx insn, next;
struct record_stack_memrefs_data data;
! for (insn = bb->head; ; insn = next)
{
! rtx set;
!
! pending_delete = NULL_RTX;
next = NEXT_INSN (insn);
if (! INSN_P (insn))
! goto processed;
set = single_set_for_csa (insn);
if (set)
--- 2331,2347 ----
HOST_WIDE_INT last_sp_adjust = 0;
rtx last_sp_set = NULL_RTX;
struct csa_memlist *memlist = NULL;
! rtx insn, next, set;
struct record_stack_memrefs_data data;
+ bool end_of_block = false;
! for (insn = bb->head; !end_of_block ; insn = next)
{
! end_of_block = insn == bb->end;
next = NEXT_INSN (insn);
if (! INSN_P (insn))
! continue;
set = single_set_for_csa (insn);
if (set)
*************** combine_stack_adjustments_for_block (bb)
*** 2365,2371 ****
{
last_sp_set = insn;
last_sp_adjust = this_adjust;
! goto processed;
}
/* If not all recorded memrefs can be adjusted, or the
--- 2363,2369 ----
{
last_sp_set = insn;
last_sp_adjust = this_adjust;
! continue;
}
/* If not all recorded memrefs can be adjusted, or the
*************** combine_stack_adjustments_for_block (bb)
*** 2397,2405 ****
this_adjust))
{
/* It worked! */
! pending_delete = insn;
last_sp_adjust += this_adjust;
! goto processed;
}
}
--- 2395,2403 ----
this_adjust))
{
/* It worked! */
! delete_insn (insn);
last_sp_adjust += this_adjust;
! continue;
}
}
*************** combine_stack_adjustments_for_block (bb)
*** 2418,2433 ****
last_sp_adjust += this_adjust;
free_csa_memlist (memlist);
memlist = NULL;
! goto processed;
}
}
! /* Combination failed. Restart processing from here. */
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = insn;
last_sp_adjust = this_adjust;
! goto processed;
}
/* Find a predecrement of exactly the previous adjustment and
--- 2416,2435 ----
last_sp_adjust += this_adjust;
free_csa_memlist (memlist);
memlist = NULL;
! continue;
}
}
! /* Combination failed. Restart processing from here. If
! deallocation+allocation conspired to cancel, we can
! delete the old deallocation insn. */
! if (last_sp_set && last_sp_adjust == 0)
! delete_insn (insn);
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = insn;
last_sp_adjust = this_adjust;
! continue;
}
/* Find a predecrement of exactly the previous adjustment and
*************** combine_stack_adjustments_for_block (bb)
*** 2453,2467 ****
stack_pointer_rtx),
0))
{
- if (last_sp_set == bb->head)
- bb->head = NEXT_INSN (last_sp_set);
delete_insn (last_sp_set);
-
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
! goto processed;
}
}
--- 2455,2466 ----
stack_pointer_rtx),
0))
{
delete_insn (last_sp_set);
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
! continue;
}
}
*************** combine_stack_adjustments_for_block (bb)
*** 2471,2477 ****
&& !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
{
memlist = data.memlist;
! goto processed;
}
memlist = data.memlist;
--- 2470,2476 ----
&& !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
{
memlist = data.memlist;
! continue;
}
memlist = data.memlist;
*************** combine_stack_adjustments_for_block (bb)
*** 2481,2500 ****
&& (GET_CODE (insn) == CALL_INSN
|| reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
{
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
}
-
- processed:
- if (insn == bb->end)
- break;
-
- if (pending_delete)
- delete_insn (pending_delete);
}
! if (pending_delete)
! delete_insn (pending_delete);
}
--- 2480,2494 ----
&& (GET_CODE (insn) == CALL_INSN
|| reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
{
+ if (last_sp_set && last_sp_adjust == 0)
+ delete_insn (last_sp_set);
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
}
}
! if (last_sp_set && last_sp_adjust == 0)
! delete_insn (last_sp_set);
}