This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: egcs-1.0 Internal compiler error hpux9
- To: Neal Becker <neal at ctd dot comsat dot com>
- Subject: Re: egcs-1.0 Internal compiler error hpux9
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Mon, 22 Dec 1997 10:02:06 -0700
- Cc: egcs-bugs at cygnus dot com
- Reply-To: law at cygnus dot com
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)),