This is the mail archive of the gcc-bugs@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]

Re: egcs-1.0 Internal compiler error hpux9



  In message <E0xgaGZ-0003Sl-00@chekov.ctd.comsat.com>you write:
  > egcs-1.0 hppa1.1 hpux9.05
  > 
  > gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/include/X11R5 -I.. -I/usr/local/inc
  > lude  -g -O2 -Wall -c ifscompose_utils.c -save-temps
  > gcc: Internal compiler error: program cc1 got fatal signal 11
  > 
  > ifscompose_utils.i.gz is at http://www.ctd.comsat.com/~neal
This patch should fix both your aborts.  It will be included in egcs-1.0.1:

        * haifa-sched.c (create_reg_dead_note): Detect and handle another
        case where we kill more regs after sched than were killed before
        sched.
        * sched.c (create_reg_dead_note): Similarly.


Index: haifa-sched.c
===================================================================
RCS file: /cvs/cvsfiles/egcs/gcc/haifa-sched.c,v
retrieving revision 1.17
diff -c -3 -p -r1.17 haifa-sched.c
*** haifa-sched.c	1997/10/07 16:53:16	1.17
--- haifa-sched.c	1997/12/22 16:49:32
*************** create_reg_dead_note (reg, insn)
*** 4462,4467 ****
--- 4462,4484 ----
        while (reg_note_regs < regs_killed)
  	{
  	  link = XEXP (link, 1);
+ 
+ 	  /* LINK might be zero if we killed more registers after scheduling
+ 	     than before, and the last hard register we kill is actually
+ 	     multiple hard regs. 
+ 
+ 	     This is normal for interblock scheduling, so deal with it in
+ 	     that case, else abort.  */
+ 	  if (link == NULL_RTX && current_nr_blocks <= 1)
+ 	    abort ();
+ 	  else if (link == NULL_RTX)
+ 	    {
+ 	      link = rtx_alloc (EXPR_LIST);
+ 	      PUT_REG_NOTE_KIND (link, REG_DEAD);
+ 	      XEXP (link, 0) = gen_rtx (REG, word_mode, 0);
+ 	      XEXP (link, 1) = NULL_RTX;
+ 	    }
+ 	     
  	  reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
  			    : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
  						GET_MODE (XEXP (link, 0))));
Index: sched.c
===================================================================
RCS file: /cvs/cvsfiles/egcs/gcc/sched.c,v
retrieving revision 1.6
diff -c -3 -p -r1.6 sched.c
*** sched.c	1997/09/22 17:41:43	1.6
--- sched.c	1997/12/22 16:52:25
*************** create_reg_dead_note (reg, insn)
*** 2208,2213 ****
--- 2208,2219 ----
  					   GET_MODE (XEXP (link, 0))));
        while (reg_note_regs < regs_killed)
  	{
+ 	  /* LINK might be zero if we killed more registers after scheduling
+ 	     than before, and the last hard register we kill is actually
+ 	     multiple hard regs.  */
+ 	  if (link == NULL_RTX)
+ 	    abort ();
+   
  	  link = XEXP (link, 1);
  	  reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
  			    : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),


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