GENTZEL@CPWSCB.PSC.EDU (Dave Gentzel) (06/04/89)
I've uncovered a major bug in version 3.0 of DEC's VAX C compiler for VMS.
This bug showed up compiling GNU Emacs. (Emacs users take note. You should
compile DISPNEW.C with /OPTIMIZE=NOINLINE so long as this bug exists. There
may be other files which tickle the bug, but this is the only one I noticed.
The symptom is that redisplays become strangely and decidedly non-optimal!)
Basically, the compiler messes up some references to the arguments of inlined
functions. Here is a file which tickles the bug along with an annotated
assembler listing showing the problem. Yet another reason to use GCC, I
suppose...
David Gentzel
Pittsburgh Supercomputing Center
gentzel@cpwsca.psc.edu
or gentzel@morgul.psc.edu
P.S. I haven't submitted an SPR on this. Any takers?
------------------------------ bug.c ------------------------------
int count_blanks(char *str)
{
char *p = str;
while (*str++ == ' ');
return str - p - 1;
}
int bug(char *s)
{
return count_blanks(s);
}
------------------------------ tst.c ------------------------------
#include <stdio.h>
main()
{
char test[] = " ";
printf("right: %d\ncount_blanks: %d\nbug: %d\n",
sizeof test - 1, count_blanks(test), bug(test));
}
-------------------------------------------------------------------
int count_blanks(char *str)
{
count_blanks:
.entry count_blanks,^m<>
subl2 #4,sp
register char *p = str;
movl 4(ap),r1
while (*str++ == ' ');
incl 4(ap)
cmpb (r1),#32
bneq sym.2
tstl r0
nop
sym.1:
movl 4(ap),r0
incl 4(ap)
cmpb (r0),#32
beql sym.1
sym.2:
return str - p - 1;
subl3 r1,4(ap),r0
decl r0
ret
}
int bug(register char *s)
{
bug:
.entry bug,^m<r2>
subl2 #4,sp
return count_blanks(s);
movl 4(ap),r1
cmpb (r1)+,#32
bneq sym.4
tstl r0
sym.3:
cmpb (r1)+,#32
beql sym.3
sym.4:
subl3 r1,r1,r2 <--- BUG HERE
should be
subl3 r1,4(ap),r2
decl r2
movl r2,r0
ret
}
-------------------------------------------------------------------