pcc register allocation bug
utzoo!decvax!harpo!eagle!mit-vax!mp
utzoo!decvax!harpo!eagle!mit-vax!mp
Mon Apr 4 18:41:04 AEST 1983
Awhile ago I passed on a problem that was observed in the
4.1bsd (and System III and V) pcc. It went like this:
From: Jeff Mogul <mogul at Shasta>
The problem arises whenever an expression includes a comparison
of a float and a double, and at least one other operation. Either
the expression doesn't evaluate correctly because a temporary register
is being used for two different things, or it does evaluate correctly,
but a live register may be bashed.
Here is a program that fails:
#include <stdio.h>
double dd[] = { 0.0, 2.0 };
float ff[] = { 0.0, 1.0 };
int i = 1;
main(){
if( ff[i] >= dd[i] ) printf( "ff >= dd\n" );
}
Here is the buggy Vax machine code (cc -S, no optimizer):
movl _i,r0
movl _i,r1
cvtfd _ff[r0],r0
cmpd r0,_dd[r1]
jlss L25
Jeff Mogul and John Gill, of Stanford, found a way to fix the bug.
They write:
It involves changing one file (/usr/[local/]src/cmd/pcc/table.c),
recompiling, and re-installing (using "make", of course.)
*** /usr/src/cmd/pcc/table.c Wed Dec 17 15:04:41 1980
--- ntable.c Sun Mar 6 11:00:36 1983
***************
*** 228,234
OPLOG, FORCC,
SAREG|AWD, TDOUBLE,
SAREG|AWD, TFLOAT,
! NAREG|NASR, RESCC,
" cvtfd AR,A1\n cmpd AL,A1\nZP",
OPLOG, FORCC,
--- 228,234 -----
OPLOG, FORCC,
SAREG|AWD, TDOUBLE,
SAREG|AWD, TFLOAT,
! 2*NTEMP, RESCC,
" cvtfd AR,A1\n cmpd AL,A1\nZP",
OPLOG, FORCC,
***************
*** 234,240
OPLOG, FORCC,
SAREG|AWD, TFLOAT,
SAREG|AWD, TDOUBLE,
! NAREG|NASL, RESCC,
" cvtfd AL,A1\n cmpd A1,AR\nZP",
OPLOG, FORCC,
--- 234,240 -----
OPLOG, FORCC,
SAREG|AWD, TFLOAT,
SAREG|AWD, TDOUBLE,
! 2*NTEMP, RESCC,
" cvtfd AL,A1\n cmpd A1,AR\nZP",
OPLOG, FORCC,
More information about the Comp.lang.c
mailing list