[patch] Fix gcc.c-torture/execute/20000706-3.c for the v850

law@redhat.com law@redhat.com
Fri May 3 15:07:00 GMT 2002


In message <200205031855.g43ItGw22558@remus.sfbay.redhat.com>, Catherine Moore 
writes:
 > The execution of gcc.c-torture/execute/20000706-3.c never
 > completed because the generated code was overwriting the 
 > return address on the stack.  This patch fixes that problem
 > by correcting the calculation of the register save area
 > size.
 > 
 > Catherine
 > 
 > 	* config/v850/v850.c (compute_register_save_size): Make sure
 > 	to count all of the registers that will be saved.
 > 
 > Index: v850.c
 > ===================================================================
 > RCS file: /cvs/gcc/egcs/gcc/config/v850/v850.c,v
 > retrieving revision 1.54
 > diff -p -r1.54 v850.c
 > *** v850.c      22 Mar 2002 19:29:21 -0000      1.54
 > --- v850.c      3 May 2002 18:14:38 -0000
 > *************** compute_register_save_size (p_reg_saved)
 > *** 1442,1455 ****
 >          need to cover the possibility that such a helper function will
 >          be used, despite the fact that there might be gaps in the list of
 >          registers that need to be saved.  To detect this we note that the
 > !        helper functions always push at least register r29 if the link
 > !        register is not used, and at least registers r27 - r31 if the
 > !        link register is used (and provided that the function is not an
 > !        interrupt handler).  */
 >          
 >         if (TARGET_PROLOG_FUNCTION
 > !         && (i == 2 || i >= 20)
 > !         && regs_ever_live[LINK_POINTER_REGNUM] ? (i < 28) : (i < 30))
 >         {
 >           if (i == 2)
 >             {
 > --- 1442,1452 ----
 >          need to cover the possibility that such a helper function will
 >          be used, despite the fact that there might be gaps in the list of
 >          registers that need to be saved.  To detect this we note that the
 > !        helper functions always push at least register r29 (provided
 > !        that the function is not an interrupt handler).  */
 >          
 >         if (TARGET_PROLOG_FUNCTION
 > !         && (i == 2 || i >= 20 && (i < 30)))
Where you trying to write
A || (B && C)

or 

(A || B) && C

It seems to me this should be

  && (i == 2 || i >= 20)
  && i < 30

Or am I mistaken?

jeff



More information about the Gcc-patches mailing list