[gnu.gcc.bug] -p option produces bad code for 386 Symmetry

schmidt%bonnie.ics.uci.edu@orion.cf.uci.edu ("Douglas C. Schmidt") (09/27/88)

Bug Report for GCC:
-------------------
Problem :  Using the profiling option produces bad asm code
           for the Sequent Symmetry 386 port. I've marked
	   the problem in the asm code included below.

1.) Version : gcc 1.28
-----------

2.) Input Program :
-----------------
# 1 "veryfast.c"
# 1 "/usr/include/stdio.h"
extern	struct	_iobuf {
	int	_cnt;
	char	*_ptr;
	char	*_base;
	int	_bufsiz;
	short	_flag;
	char	_file;
} _iob[20 ];
struct _iobuf 	*fopen();
struct _iobuf 	*fdopen();
struct _iobuf 	*freopen();
long	ftell();
char	*gets();
char	*fgets();
char	*sprintf();
# 1 "veryfast.c"
static unsigned char access_table[] = {
            0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
            4,  8, 13, 17, 17, 25, 25, 29, 35, 39,
           44, 52, 56, 60, 66, 71, 74, 82, 87, 93,
          100,100,103,108,110,119,119,122,128,135,
          141,146,152,158,158,158,158,158,164,164,
          164,164,164,164,168,168,176,176,178,178,
          178,178,178,178,184,184,184,184,184,184,
          184,184,184,190 };
static char *word_table = 
"elsecaseconstautocontinuecharexternenumbreakregistergotolong \
 returnwhileasmvolatilefloattypeoftypedefforuniondo__alignof \
 intdoubledefaultinlineshortstructswitchstaticvoid \
 unsignedifsizeofsigned";

inline static int hash(str,len)
register char	*str;             
register int	len;
{
	static int   cval[] = {
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		  0,  0,  0,  0,  0,  3,  0,  8, 14,  6,
		 31,  0, 22, 17,  1, 33,  0,  0,  1, 14,
		 11,  0,  0,  0,  6, 35,  0, 16, 18, 19,
		  0,  0,  0,  0,  0,  0,  0,  0, 
	};
	register int	hval;

	switch(hval = len) {
		default:
			hval += cval[(int)str[0]];
			hval += cval[(int)str[len - 1]];
		case 0:
			return(hval);
	}
}

inline static in_word_set(str,len)
register char *str;
register int len;
{
	if (len >=       2  && len <=       9 ) {
		register int key = hash(str,len);

		if (key >=        4  && key <=        72 ) {
			register int i = access_table[key];
			register int j = access_table[key+1];

			while (i < j) {
				if (*str++ != word_table[i++]) {
					return(0);
				}
			}

			return(*str == '\0');
		}
	}
	return(0);
}

main() {
   char Buf[80];
   int  Len;
   int  i = 0;

   while((Len = Get_Line(Buf,80)) != (-1) ) {
      if (in_word_set(Buf,Len)) {
         i++;
      }
   }
   printf("i = %d\n",i);
}

3.) Command Used : gcc  -p 
----------------

4.) Files used :
--------------
		tm.h -> tm-seq386.h 
		md   -> i386.md
                config.h -> config.i386.h

5.) Machine(s) used :
-------------------
		Sequent Symmetry    DYNIX (TM)V3 (BSD 4.3 features)

6.) Compiler diagnostics :
------------------------
Assembler:
"veryfast.c", line 232: "lea" is not followed by a ':' for a label definition
        1.5 real         0.8 user         0.4 sys  

7.) Asm output:
---------------
	.file	"yow.c"
.data
_access_table:
	.byte 0
	.byte 0
	.byte 0
	.byte 0
	.byte 0
	.byte 4
	.byte 4
	.byte 4
	.byte 4
	.byte 4
	.byte 4
	.byte 8
	.byte 13
	.byte 17
	.byte 17
	.byte 25
	.byte 25
	.byte 29
	.byte 35
	.byte 39
	.byte 44
	.byte 52
	.byte 56
	.byte 60
	.byte 66
	.byte 71
	.byte 74
	.byte 82
	.byte 87
	.byte 93
	.byte 100
	.byte 100
	.byte 103
	.byte 108
	.byte 110
	.byte 119
	.byte 119
	.byte 122
	.byte 128
	.byte 135
	.byte 141
	.byte 146
	.byte 152
	.byte 158
	.byte 158
	.byte 158
	.byte 158
	.byte 158
	.byte 164
	.byte 164
	.byte 164
	.byte 164
	.byte 164
	.byte 164
	.byte 168
	.byte 168
	.byte 176
	.byte 176
	.byte 178
	.byte 178
	.byte 178
	.byte 178
	.byte 178
	.byte 178
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 184
	.byte 190
.text
LC0:
	.ascii "elsecaseconstautocontinuecharexternenumbreakregistergotolong  returnwhileasmvolatilefloattypeoftypedefforuniondo__alignof  intdoubledefaultinlineshortstructswitchstaticvoid  unsignedifsizeofsigned\0"
.data
	.align 2
_word_table:
	.long LC0
	.align 2
_cval.0:
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 3
	.long 0
	.long 8
	.long 14
	.long 6
	.long 31
	.long 0
	.long 22
	.long 17
	.long 1
	.long 33
	.long 0
	.long 0
	.long 1
	.long 14
	.long 11
	.long 0
	.long 0
	.long 0
	.long 6
	.long 35
	.long 0
	.long 16
	.long 18
	.long 19
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
	.long 0
.text
LC1:
	.ascii "i = %d\12\0"
	.align 2
.globl _main
_main:
	pushl %ebp
	movl %esp,%ebp
	subl $112,%esp
	pushl %ebx
	pushl %esi
	pushl %edi
.data
	.align 2
LP0:
	.long 0
.text
	lea EAX,LP0             /* this looks like the culprit */
	call mcount
	movl $0,-88(%ebp)
L36:
	pushl $80
	leal -80(%ebp),%eax
	pushl %eax
	call _Get_Line
	movl %eax,%eax
	movl %eax,%eax
	movl %eax,-84(%ebp)
	leal 8(%esp),%esp
	cmpl $-1,%eax
	je L37
	leal -80(%ebp),%eax
	movl -84(%ebp),%edx
	movl %edx,-108(%ebp)
	leal -88(%ebp),%ecx
	cmpl $1,-108(%ebp)
	jle L40
	cmpl $9,-108(%ebp)
	jg L40
	movl %eax,%esi
	movl %edx,-112(%ebp)
	leal -88(%ebp),%ebx
	movl -112(%ebp),%ebx
	cmpl $0,%ebx
	je L44
	jmp L43
L43:
	movsbl (%esi),%edx
	movl %edx,-92(%ebp)
	movl %edx,%edi
	addl _cval.0(,%edi,4),%ebx
	movl -112(%ebp),%edi
	movsbl -1(%esi,%edi),%edx
	movl %edx,-96(%ebp)
	movl %edx,%edi
	addl _cval.0(,%edi,4),%ebx
L44:
	movl %ebx,%ecx
	jmp L41
L42:
L41:
	cmpl $3,%ecx
	jle L46
	cmpl $72,%ecx
	jg L46
	movzbl _access_table(%ecx),%ebx
	movzbl _access_table+1(%ecx),%edx
	movl %edx,-112(%ebp)
L47:
	cmpl -112(%ebp),%ebx
	jge L48
	movl %ebx,%esi
	addl _word_table,%esi
	incl %ebx
	movb (%eax),%dl
	movb %dl,-100(%ebp)
	incl %eax
	cmpb (%esi),%dl
	je L49
	xorl %esi,%esi
	jmp L39
L49:
	jmp L47
L48:
	movl $0,-104(%ebp)
	cmpb $0,(%eax)
	jne L50
	movl $1,-104(%ebp)
L50:
	movl -104(%ebp),%esi
	jmp L39
L46:
L40:
	xorl %esi,%esi
	jmp L39
L39:
	cmpl $0,%esi
	je L38
	incl -88(%ebp)
L38:
	jmp L36
L37:
	pushl -88(%ebp)
	pushl $LC1
	call _printf
L35:
	leal -124(%ebp),%esp
	popl %edi
	popl %esi
	popl %ebx
	leave
	ret