From: tim@cs.wisc.edu (Tim Theisen)
Subject: Internal compiler error for gcc-2.3.1 on romp-ibm-aos.
Organization: University of Wisconsin-Madison, Department of Computer Sciences
Distribution: gnu
Date: Mon, 9 Nov 1992 04:22:35 GMT

The following input causes an internal compiler error when compiled at
optimization level 2 or 3 with gcc-2.3.1 on an IBM RT running BSD 4.3.
Reducing to optimization level 1 allows it to be compiled.

Here is the invocation:

$ gcc -v -O2 -c zht.c
Reading specs from /usr/gnu/lib/gcc-lib/romp-ibm-aos/2.3.1/specs
gcc version 2.3.1
 /usr/gnu/lib/gcc-lib/romp-ibm-aos/2.3.1/cpp -lang-c -v -undef -D__GNUC__=2 -Dibm032 -Dunix -D__ibm032__ -D__unix__ -D__ibm032 -D__unix -D__CHAR_UNSIGNED__ -D__OPTIMIZE__ zht.c /usr/tmp/cc009938.i
GNU CPP version 2.3.1
 /usr/gnu/lib/gcc-lib/romp-ibm-aos/2.3.1/cc1 /usr/tmp/cc009938.i -quiet -dumpbase zht.c -O2 -version -o /usr/tmp/cc009938.s
GNU C version 2.3.1 compiled by GNU C version 2.3.1.
zht.c: In function `screen_sample':
zht.c:441: internal error--unrecognizable insn:
(insn 238 74 59 (reg:SI 6 r6) -1 (nil)
   (nil))
gcc: Internal compiler error: program cc1 got fatal signal 5

Here is the input:
------------------8<----------------zht.c----------------------------
extern	struct	_iobuf {
	int	_cnt;
	char	*_ptr;		 
	char	*_base;		 
	int	_bufsiz;
	short	_flag;
	char	_file;		 
} _iob[];
typedef unsigned long size_t;
typedef char *va_list;
struct _iobuf 	*fopen(const char *filename, const char *type);
struct _iobuf 	*freopen(const char *filename, const char *type, struct _iobuf  *stream);
struct _iobuf 	*fdopen(int fildes, const char *type);
struct _iobuf 	*popen(const char *command, const char *type);
int	pclose(struct _iobuf  *stream);
int	fflush(struct _iobuf  *stream);
int	fclose(struct _iobuf  *stream);
int	remove(const char *path);
int	rename(const char *from, const char *to);
struct _iobuf 	*tmpfile(void);
char	*tmpnam(char *s);
int	setvbuf(struct _iobuf  *iop, char *buf, int type, size_t size);
int	setbuf(struct _iobuf  *stream, char *buf);
int	setbuffer(struct _iobuf  *stream, char *buf, size_t size);
int	setlinebuf(struct _iobuf  *stream);
int	fprintf(struct _iobuf  *stream, const char *format, ...);
int	printf(const char *format, ...);
char	*sprintf(char *s, const char *format, ...);
int	vfprintf(struct _iobuf  *stream, const char *format, va_list arg);
int	vprintf(const char *format, va_list arg);
int	vsprintf(char *s, const char *format, va_list arg);
int	fscanf(struct _iobuf  *stream, const char *format, ...);
int	scanf(const char *format, ...);
int	sscanf(const char *s, const char *format, ...);
int	fgetc(struct _iobuf  *stream);
int	getw(struct _iobuf  *stream);
char	*fgets(char *s, int n, struct _iobuf  *stream);
char	*gets(char *s);
int	fputc(int c, struct _iobuf  *stream);
int	putw(int w, struct _iobuf  *stream);
int	fputs(const char *s, struct _iobuf  *stream);
int	puts(const char *s);
int	ungetc(int c, struct _iobuf  *stream);
int	fread(void *ptr, size_t size, size_t count, struct _iobuf  *iop);
int	fwrite(const void *ptr, size_t size, size_t count, struct _iobuf  *iop);
int	fseek(struct _iobuf  *stream, long offset, int ptrname);
long	ftell(struct _iobuf  *stream);
void rewind(struct _iobuf  *stream);
int	fgetpos(struct _iobuf  *stream, long *pos);
int	fsetpos(struct _iobuf  *stream, const long *pos);
void perror(const char *s);
typedef unsigned char byte;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef	unsigned char	u_char;
typedef	unsigned short	u_short;
typedef	unsigned int	u_int;
typedef	unsigned long	u_long;
typedef	unsigned short	ushort_ ;		 
typedef	struct	_physadr { int r[1]; } *physadr;
typedef	struct	label_t	{
	int	val[11];
} label_t;
typedef	struct	_quad { long val[2]; } quad;
typedef	long	daddr_t;
typedef	char *	caddr_t;
typedef	u_long	ino_t;
typedef	long	swblk_t;
typedef	long	time_t;
typedef	short	dev_t;
typedef	long	off_t;
typedef	u_short	uid_t;
typedef	u_short	gid_t;
typedef signed char prio_t;	 
typedef long	fd_mask;
typedef	struct fd_set {
	fd_mask	fds_bits[(((256 )+(( (sizeof(fd_mask) * 8		)	)-1))/( (sizeof(fd_mask) * 8		)	)) ];
} fd_set;
typedef struct qhdr {
	struct qhdr *link, *rlink;
} *queue_t;
typedef char *ptr_ord_t;
typedef double floatp;
typedef char *(*proc_alloc_t)(unsigned num_elements, unsigned element_size, const char *client_name );
typedef void (*proc_free_t)(char *data, unsigned num_elements, unsigned element_size, const char *client_name );
extern struct _iobuf  *gs_out;
typedef struct gs_point_s {
	double x, y;
} gs_point;
typedef struct gs_int_point_s {
	int x, y;
} gs_int_point;
typedef struct gs_rect_s {
	gs_point p, q;			 
} gs_rect;
typedef struct gs_int_rect_s {
	gs_int_point p, q;
} gs_int_rect;
typedef struct gs_state_s gs_state;
typedef struct {
	proc_alloc_t alloc;
	proc_free_t free;
} gs_memory_procs;
char *gs_malloc(uint, uint, const char * );
void gs_free(char *, uint, uint, const char * );
extern char gs_debug[128];
extern int gs_log_error(int, const char   *, int );
typedef struct ref_s ref;
typedef enum {
	t_array,			 
	t_boolean,			 
	t_condition,			 
	t_dictionary,			 
	t_file,				 
	t_fontID,			 
	t_gstate,			 
	t_integer,			 
	t_lock,				 
	t_mark,				 
	t_name,				 
	t_null,				 
	t_operator,			 
	t_real,				 
	t_save,				 
	t_string,			 
	t_mixedarray,			 
	t_shortarray,			 
	t_color,			 
	t_device,			 
	t_oparray,			 
	t_next_index		 
} ref_type;
					 
					 
typedef struct dict_s dict;
typedef struct name_s name;
typedef int (*dummy_op_proc_p)();
struct stream_s;
struct gs_font_s;
struct gs_color_s;
struct gs_condition_s;
struct gs_lock_s;
struct gx_device_s;
struct gstate_obj_s;
struct vm_save_s;
struct tas_s {
	ushort type_attrs;
	ushort rsize;
};
struct ref_s {
	struct tas_s tas;
	union v {			 
		long intval;
		ushort index;		 
		float realval;
		byte *bytes;
		struct ref_s *refs;
		name *pname;
		dict *pdict;
		ushort *packed;
		dummy_op_proc_p opproc;
		struct stream_s *pfile;
		struct gs_font_s *pfont;
		struct gs_color_s *pcolor;
		struct gs_condition_s *pcond;
		struct gs_lock_s *plock;
		struct gx_device_s *pdevice;
		struct gstate_obj_s *pgstate;
		struct vm_save_s *psave;
	} value;
};
void *memccpy(void *t, const void *f, int c, size_t n);
void *memchr(const void *s, int c, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
void *memcpy(void *t, const void *f, size_t n);
void *memset(void *s, int c, size_t n);
extern void memswab(const char *src, char *dest, int count);
extern void memflip8x8(const byte *inp, int line_size, byte *outp, int dist);
extern const char   *gs_error_names[];
		 
		 
typedef ref   *os_ptr;
extern os_ptr osbot, osp, ostop;
typedef int (*op_proc_p)(os_ptr );
typedef struct {
	const char   *oname;
	op_proc_p proc;
	int   *oindex;
} op_def;
typedef op_def const   *op_def_ptr;
extern op_def_ptr *op_def_table;
extern uint op_def_count;
extern ref op_array_table;		 
extern ushort *op_array_nx_table;
extern uint op_array_count;
extern int bytes_compare(const byte *, uint, const byte *, uint );
extern int string_match(const byte *str, uint len, const byte *pstr, uint plen, int ignore_case );
extern uint string_hash(const byte *, uint );
struct gs_prop_item_s;
extern int props_extract(
	struct gs_prop_item_s *plist,	
	int count,
	const struct gs_prop_item_s *template, 
					
	int tcount,
	struct gs_prop_item_s **pknown,	
					
					
					
	int finished			
					
 );
extern void refcpy_to_new(ref *to, const ref *from, uint size );
extern void refcpy_to_old(ref *to, const ref *from, uint size, const char *client_name );
extern void refset_null(ref *to, uint size );
extern int obj_eq(const ref *, const ref * );
extern int obj_cvs(const ref *, byte *, uint, uint * );
extern int string_to_ref(const char *, ref *, const char * );
extern char *ref_to_string(const ref *, const char * );
extern int num_params(const ref *, int, float * );
extern int real_param(const ref *, float * );
struct gs_matrix_s;
extern int read_matrix(const ref *, struct gs_matrix_s * );
extern int write_matrix(ref * );
typedef struct {
	const char   *vname;
	ref   *pvref;
} names_def;
extern void init_names(const names_def   * );
extern os_ptr osp_nargs[6 ];
void	alloc_init(proc_alloc_t, proc_free_t, uint );
char	*alloc(uint num_elts, uint elt_size, const char *client_name );
void	alloc_free(char *data, uint num_elts, uint elt_size, const char *client_name );
void	alloc_status(long *, long * );
byte	*alloc_grow(byte *data, uint old_num, uint new_num, uint elt_size, const char *client_name );
byte	*alloc_shrink(byte *data, uint old_num, uint new_num, uint elt_size, const char *client_name );
typedef ref   *es_ptr;
extern es_ptr esbot, esp, estop;
extern es_ptr esfile;
typedef struct gs_matrix_s {
	long _xx  ; float xx;	long _xy  ; float xy;	long _yx  ; float yx;	long _yy  ; float yy;	long _tx  ; float tx;	long _ty  ; float ty ;
} gs_matrix;
void	gs_make_identity(gs_matrix * );
int	gs_make_translation(floatp, floatp, gs_matrix * ),
	gs_make_scaling(floatp, floatp, gs_matrix * ),
	gs_make_rotation(floatp, gs_matrix * );
int	gs_matrix_multiply(const gs_matrix *, const gs_matrix *, gs_matrix * ),
	gs_matrix_invert(const gs_matrix *, gs_matrix * ),
	gs_matrix_rotate(const gs_matrix *, floatp, gs_matrix * );
int	gs_point_transform(floatp, floatp, const gs_matrix *, gs_point * ),
	gs_point_transform_inverse(floatp, floatp, const gs_matrix *, gs_point * ),
	gs_distance_transform(floatp, floatp, const gs_matrix *, gs_point * ),
	gs_distance_transform_inverse(floatp, floatp, const gs_matrix *, gs_point * ),
	gs_bbox_transform_inverse(gs_rect *, gs_matrix *, gs_rect * );
 	 
typedef enum {
	gs_cap_butt = 0,
	gs_cap_round = 1,
	gs_cap_square = 2
} gs_line_cap;
typedef enum {
	gs_join_miter = 0,
	gs_join_round = 1,
	gs_join_bevel = 2
} gs_line_join;
gs_state *gs_state_alloc(proc_alloc_t, proc_free_t );  
int	gs_state_free(gs_state * );
int	gs_gsave(gs_state * ),
	gs_grestore(gs_state * ),
	gs_grestoreall(gs_state * );
gs_state *gs_gstate(gs_state * );
int	gs_currentgstate(gs_state * , const gs_state *  ),
	gs_setgstate(gs_state * , const gs_state *  );
gs_state *gs_state_swap_saved(gs_state *, gs_state * );	 
void	gs_state_swap(gs_state *, gs_state * );	 
int	gs_initgraphics(gs_state * );
typedef struct gx_device_s gx_device;
int	gs_flushpage(gs_state * );
int	gs_copypage(gs_state * );
int	gs_output_page(gs_state *, int, int );
int	gs_copyscanlines(gx_device *, int, byte *, uint, int *, uint * );
gx_device *	gs_getdevice(int );
int	gs_copydevice(gx_device **, gx_device *, proc_alloc_t );
int	gs_makeimagedevice(gx_device **, gs_matrix *, uint, uint, byte *, int, proc_alloc_t );
void	gs_nulldevice(gs_state * );
int	gs_setdevice(gs_state *, gx_device * );
gx_device *	gs_currentdevice(gs_state * );
const char *	gs_devicename(gx_device * );
void	gs_deviceinitialmatrix(gx_device *, gs_matrix * );
int	gs_closedevice(gx_device * );
int	gs_setlinewidth(gs_state *, floatp );
float	gs_currentlinewidth(const gs_state * );
int	gs_setlinecap(gs_state *, gs_line_cap );
gs_line_cap	gs_currentlinecap(const gs_state * );
int	gs_setlinejoin(gs_state *, gs_line_join );
gs_line_join	gs_currentlinejoin(const gs_state * );
int	gs_setmiterlimit(gs_state *, floatp );
float	gs_currentmiterlimit(const gs_state * );
int	gs_setdash(gs_state *, const float *, uint, floatp );
uint	gs_currentdash_length(const gs_state * );
int	gs_currentdash_pattern(const gs_state *, float * );
float	gs_currentdash_offset(const gs_state * );
int	gs_setflat(gs_state *, floatp );
float	gs_currentflat(const gs_state * );
int	gs_setstrokeadjust(gs_state *, int );
int	gs_currentstrokeadjust(const gs_state * );
typedef enum {
	gs_color_space_DeviceGray = 0,
	gs_color_space_DeviceRGB,
	gs_color_space_DeviceCMYK	 
} gs_color_space;
typedef struct gs_color_s gs_color;
extern const uint gs_color_sizeof;
int	gs_setgray(gs_state *, floatp );
float	gs_currentgray(gs_state * );
int	gs_sethsbcolor(gs_state *, floatp, floatp, floatp ),
	gs_currenthsbcolor(gs_state *, float [3] ),
	gs_setrgbcolor(gs_state *, floatp, floatp, floatp ),
	gs_currentrgbcolor(gs_state *, float [3] );
int	gs_currentcolorspace(gs_state *, gs_color_space * );
typedef float (*gs_transfer_proc)(gs_state *, floatp );
int	gs_settransfer(gs_state *, gs_transfer_proc ),
	gs_settransfer_remap(gs_state *, gs_transfer_proc, int );
gs_transfer_proc	gs_currenttransfer(gs_state * );
int	gs_setcolortransfer(gs_state *, gs_transfer_proc ,
			gs_transfer_proc , gs_transfer_proc ,
			gs_transfer_proc  ),
	gs_setcolortransfer_remap(gs_state *, gs_transfer_proc ,
			gs_transfer_proc , gs_transfer_proc ,
			gs_transfer_proc , int );
void	gs_currentcolortransfer(gs_state *, gs_transfer_proc [4] );
int	gs_setscreen(gs_state *, floatp, floatp, float (*)(floatp, floatp ) );
int	gs_currentscreen(gs_state *, float *, float *, float (**)(floatp, floatp ) );
int	gs_sethalftonephase(gs_state *, int, int );
int	gs_currenthalftonephase(gs_state *, gs_int_point * );
typedef struct gs_screen_enum_s gs_screen_enum;
extern const uint gs_screen_enum_sizeof;
int	gs_screen_init(gs_screen_enum *, gs_state *, floatp, floatp );
int	gs_screen_currentpoint(gs_screen_enum *, gs_point * );
int	gs_screen_next(gs_screen_enum *, floatp );
typedef struct int_gstate_s int_gstate;
struct int_gstate_s {
		 
	ref screen_proc;		 
	struct {
		ref red, green, blue, gray;	 
	} transfer_procs;
	ref font;			 
	int_gstate *saved;		 
};
extern int_gstate istate;
extern gs_state *igs;
	 
	 
extern int alloc_save_new_mask;		 
extern int alloc_save_test_mask;	 
extern int alloc_save_change(ref *ptr, const char *client_name );
extern ref *alloc_refs(uint num_refs, const char *client_name );
static  int screen_sample(os_ptr );
static  int set_screen_continue(os_ptr );
static  int i_set_screen_continue;
int
zcurrenthalftonephase(register os_ptr op)
{	gs_int_point phase;
	gs_currenthalftonephase(igs, &phase);
	if ( (osp = op += (2)) > ostop ) return (osp -= (2), (-16) ) ;
	((op - 1)->value. intval = (  phase.x), ((op - 1)->tas.type_attrs = ((  t_integer) << 7 ) + ( 0)) )   ;
	((op)->value. intval = (  phase.y), ((op)->tas.type_attrs = ((  t_integer) << 7 ) + ( 0)) )   ;
	return 0;
}
int
zcurrentscreen(register os_ptr op)
{	float freq, angle;
	float (*proc)(floatp, floatp );
	gs_currentscreen(igs, &freq, &angle, &proc);
	if ( (osp = op += (3)) > ostop ) return (osp -= (3), (-16) ) ;
	((op - 2)->value. realval = (  freq), ((op - 2)->tas.type_attrs = ((  t_real) << 7 ) + ( 0)) )   ;
	((op - 1)->value. realval = (  angle), ((op - 1)->tas.type_attrs = ((  t_real) << 7 ) + ( 0)) )   ;
	*op = istate.screen_proc;
	return 0;
}
int
zsethalftonephase(register os_ptr op)
{	int code;
	long x, y;
	if ( !(((&op[-1])->tas.type_attrs & ((((1 << 6 ) - 1) << 7 ) + (0))) == ((( t_integer) << 7 ) + (0))) 	 ) return (-20)  ;
	if ( !(((&*op)->tas.type_attrs & ((((1 << 6 ) - 1) << 7 ) + (0))) == ((( t_integer) << 7 ) + (0))) 	 ) return (-20)  ;
	x = op[-1].value.intval;
	y = op->value.intval;
	if ( x != (int)x || y != (int)y )
		return (-15) ;
	code = gs_sethalftonephase(igs, (int)x, (int)y);
	if ( code >= 0 ) (osp -= (2)) ;
	return code;
}
int
zsetscreen(register os_ptr op)
{	float fa[2];
	int code = num_params(op - 1, 2, fa);
	gs_screen_enum *penum;
	if ( code < 0 ) return code;
	switch ( (((&*op)->tas.type_attrs) >> (7  - 2))   ) { default:	return(!(~((&*op)->tas.type_attrs)	 & ( 0x20  + 0x40 ))  ? (-20)  :	(-7) ); case ((((t_array) << 7 ) + ( 0x20  + 0x40 )) >> (7  - 2))  : case ((((t_mixedarray) << 7 ) + ( 0x20  + 0x40 )) >> (7  - 2))  : case ((((t_shortarray) << 7 ) + ( 0x20  + 0x40 )) >> (7  - 2))  : ; } ;
	penum = (gs_screen_enum *)alloc(1, gs_screen_enum_sizeof, "setscreen");
	if ( penum == 0 ) return (-25) ;
	code = gs_screen_init(penum, igs, fa[0], fa[1]);
	if ( code < 0 )
	   {	alloc_free((char *)penum, 1, gs_screen_enum_sizeof, "setscreen");
		return code;
	   }
	 
	if ( esp + (3 ) > estop ) return (-5)  ;
	(++esp, ((esp)->value. index = (  0			), ((esp)->tas.type_attrs = ((  t_null) << 7 ) + (  0x40 )) )  ) ;
	*++esp = *op;			 
	++esp;
	(((esp)->value. bytes = ( (byte *)penum), ((esp)->tas.type_attrs = ((  t_string) << 7 ) + (  0)) ) , ((esp)->tas.rsize = (  gs_screen_enum_sizeof)) ) ;
	(osp -= (3)) ;  op -= 3;
	return screen_sample(op);
}
static  int
screen_sample(register os_ptr op)
{	gs_screen_enum *penum = (gs_screen_enum *)esp->value.bytes ;
	gs_point pt;
	int code = gs_screen_currentpoint(penum, &pt);
	ref proc;
	if ( code < 0 ) return code;
	if ( code != 0 )
	   {	 
		istate.screen_proc = esp[-1] ;
		esp -= 3 ;
		return 8 ;
	   }
	if ( (osp = op += (2)) > ostop ) return (osp -= (2), (-16) ) ;
	((op - 1)->value. realval = (  pt.x), ((op - 1)->tas.type_attrs = ((  t_real) << 7 ) + ( 0)) )   ;
	((op)->value. realval = (  pt.y), ((op)->tas.type_attrs = ((  t_real) << 7 ) + ( 0)) )   ;
	proc = esp[-1] ;
	(++esp, (((esp)->value. opproc = (  (dummy_op_proc_p)( set_screen_continue)), ((esp)->tas.type_attrs = ((  t_operator) << 7 ) + (  0x40 )) ) , ((esp)->tas.rsize = (     i_set_screen_continue)) )   ) ;
	*++esp = proc;
	return 3 ;
}
static  int
set_screen_continue(register os_ptr op)
{	float value;
	int code = num_params(op, 1, &value);
	if ( code < 0 ) return code;
	code = gs_screen_next((gs_screen_enum *)esp->value.bytes , value);
	if ( code < 0 ) return code;
	(osp -= (1)) ;  op--;
	return screen_sample(op);
}
op_def zht_op_defs[] = {
	{"0currenthalftonephase", zcurrenthalftonephase},
	{"0currentscreen", zcurrentscreen},
	{"2sethalftonephase", zsethalftonephase},
	{"3setscreen", zsetscreen},
		 
	{"1%set_screen_continue", set_screen_continue, &i_set_screen_continue},
	{(char   *)0, (op_proc_p)0} 
};
----------------8<------------end of zht.c----------------------

Good Luck!

...Tim

          Tim Theisen           Systems Programmer
Internet: tim@cs.wisc.edu       Department of Computer Sciences
    UUCP: uwvax!tim             University of Wisconsin-Madison
   Phone: (608)262-0438         1210 West Dayton Street
     FAX: (608)262-9777         Madison, WI   53706

Newsgroups: gnu.gcc.bug