vern@HELIOS.EE.LBL.GOV (Vern Paxson) (10/22/88)
This is regarding the following bug: Script started on Sat Oct 22 01:25:03 1988 yak 1 % cat bug.c a() { double b; b == 0.0; } yak 2 % gcc -v -mfpa -O -c !$ gcc -v -mfpa -O -c bug.c gcc version 1.29 /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 bug.c /tmp/cca21305.cpp GNU CPP version 1.29 /usr/local/lib/gcc-cc1 /tmp/cca21305.cpp -quiet -dumpbase bug.c -mfpa -O -version -o /tmp/cca21305.s GNU C version 1.29 (68k, MIT syntax) compiled by GNU C version 1.29. gcc: Program cc1 got fatal signal 6. yak 3 % exit script done on Sat Oct 22 01:25:30 1988 I don't understand gcc's internals nearly well enough to fully understand the problem, but from what I can tell what's happening is that the compare operator generates an instruction which both "birth"'s and "kills" the 2nd pseudo-register. There's special-case code to recognize this occurrence which then decrements the register's "birth" to make sure that it doesn't conflict with any of the operands to the instruction. In some cases this makes the birth quantity be 0, which is later interpreted to mean "no birth", leading to an abort(). The following appears to fix the problem: Script started on Sat Oct 22 01:29:45 1988 yak 1 % rcsdiff -c local-alloc.c RCS file: RCS/local-alloc.c,v retrieving revision 1.3 diff -c -r1.3 local-alloc.c *** /tmp/,RCSt1a21324 Sat Oct 22 01:29:53 1988 --- local-alloc.c Sat Oct 22 01:21:40 1988 *************** *** 937,943 **** assume that this register is used before all the inputs of the insn are dead. So this register must not conflict with any of them. Mark it as born at the previous insn. */ ! qty_birth[reg_qty[regno]]--; /* It should also conflict with this insn's outputs. */ qty_death[reg_qty[regno]]++; } --- 937,947 ---- assume that this register is used before all the inputs of the insn are dead. So this register must not conflict with any of them. Mark it as born at the previous insn. */ ! /* hack - if we push its birth back before the beginning of the ! block it gets regarded as not having a quantity at all and ! we subsequently abort(). */ ! if (qty_birth[reg_qty[regno]] > 1) ! qty_birth[reg_qty[regno]]--; /* It should also conflict with this insn's outputs. */ qty_death[reg_qty[regno]]++; } yak 2 % exit script done on Sat Oct 22 01:30:11 1988 Vern Vern Paxson vern@lbl-csam.arpa Real Time Systems ucbvax!lbl-csam.arpa!vern Lawrence Berkeley Laboratory (415) 486-6411