This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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);
  }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]