[gnu.gcc.bug] Possible bug in reload1.c Part 1 of 3

meissner@DG-RTP.DG.COM (03/21/89)

In making the latest GNU C compiler for the 88k, I've uncovered a
strange bug within the reload phase of GNU.  Under some circumstances,
it appears that choose_reload_targets reload1.c will call the function
emit_move_insn to reload the output.  In the case in question, though
the output is a SYMBOL_REF, which was generated by a block move (ie,
structure copy in this case).  It only fails when optimizing and when
one less register is available than is normal for the 88k.  I just
sent up the 88k patch kit to RMS, and can send it out upon request.

In particular, the block move insn is:

	(insn:QI 1355 1871 1872 (parallel[ 
	           (set (mem:BLK (reg:SI 2))
	               (mem:BLK (reg:SI 7)))
	           (use (const_int 16))
	           (use (const_int 4))
	           (clobber (reg:SI 4))
	           (clobber (reg:SI 3))
	           (clobber (reg:SI 6))
	           (clobber (reg:SI 5))
	       ] ) 55 (insn_list 1353 (nil))
	   (expr_list:QI (reg:SI 2)
	       (expr_list:QI (reg:SI 4)
	           (expr_list:QI (reg:SI 3)
	               (expr_list:QI (reg:SI 6)
	                   (expr_list:QI (reg:SI 5)
	                       (nil)))))))

The insn inserted is:

	(insn 1872 1355 1356 (set (symbol_ref:SI ("cc_status"))
	       (reg:SI 7)) -1 (nil)
	   (nil))

I put in a quick hack to not reload this case, but I think the problem
is actually further back (ie, it never should have been marked for
reloading in the first place).  Each of the relavant files is
separated by a line beginning with 20 `-'s.  The warning comes from
the 88k backend, because it's confused about seeing a SET of a
SYMBOL_REF.  In order to get this through the mailers, this message is
in three parts.  Part 1 is the source code, diagnostics log, sample
patch to fix the problem.  Part 2 is the xfinal.c.lreg file that has
been compressed (16 bit compress) and then uuencoded.  Part 3 is the
xfinal.c.greg file that has been compressed and then uuencoded.

-------------------- Running the compile

-tiktok:emacs-> r=/udd/c/release/gcc-1.34.2-sun/lib

-tiktok:emacs-> $r/gcc88 -B$r/gcc88- -v  -dlg -S -ffixed-r24 -O  xfinal.c
gcc version 1.34
 /udd/c/release/gcc-1.34.2-sun/lib/gcc88-cpp -v -undef -D__GNUC__ -Dm88000 -Dm88k -Dunix -DDGUX -D__m88000__ -D__m88k__ -D__unix__ -D__DGUX__ -D__CHAR_UNSIGNED__ -D__OPTIMIZE__ -Dmemcpy=__builtin_memcpy -Dstrcpy=__builtin_strcpy -Dmemcmp=__builtin_memcmp 
-Dstrcmp=__builtin_strcmp xfinal.c /tmp/cca01493.cpp
GNU CPP version 1.34
 /udd/c/release/gcc-1.34.2-sun/lib/gcc88-cc1 /tmp/cca01493.cpp -mdelay-slot -fomit-frame-pointer -quiet -dumpbase xfinal.c -dlg -ffixed-r24 -O -version -o xfinal.s
GNU C version 1.34 (88k, Mar 19 1989, 1.34.2) compiled by GNU C version 1.34.
default target switches: -mliteral-synthesis -mocs
xfinal.c: In function final:
xfinal.c:708: warning: CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been
xfinal.c:708: warning: output_ls_address MDEP_LS_LO16 bit set when it shouldn't have been

-------------------- Patch to fix instance of problem
*** reload1.c.orig	Tue Mar 21 10:12:10 1989
--- reload1.c	Tue Mar 21 10:12:39 1989
***************
*** 1979,1984 ****
--- 1979,1987 ----
  
        old = reload_in[j];
        if (old != 0 && ! reload_inherited[j]
+ 	  && GET_CODE (old) != SYMBOL_REF	/* quick fix for final.c on */
+ 	  && GET_CODE (old) != LABEL_REF	/* 88k, reload tried to put */
+ 	  && GET_CODE (old) != CONST		/* reg into symbol_ref.  mrm */
  	  && reload_reg_rtx[j] != old
  	  && reload_reg_rtx[j] != 0)
  	{

-------------------- xfinal.c (after preprocessing)
typedef unsigned int size_t;
typedef void * _TYP;
typedef int wchar_t;
typedef struct {
	int __va_num;
	int *__va_ptr;
} va_list;
typedef struct {
	int	_cnt;
	unsigned char	*_ptr;
	unsigned char	*_base;
	int	_flag;
	int	_file;
	int	_reserve[27];
} FILE;
extern int _filbuf();
extern FILE	_iob[64 ];
extern unsigned char *_bufendtab[];
typedef long int fpos_t;
extern FILE	*fdopen();
extern FILE     *popen();
extern char	*ctermid(), *cuserid(), *tempnam();
extern int	pclose(), system();
extern int rename (const char *__old, const char *__new) ;
extern int fclose (FILE *__stream) ;
extern int fflush (FILE *__stream) ;
extern FILE *fopen (const char *__filename, const char *__mode) ;
extern FILE *freopen (const char *__filename, const char *__mode,
                            FILE *__stream) ;
extern void setbuf (FILE *__stream, char *__buf) ;
extern int setvbuf (FILE *__stream, char *__buf, int __mode, size_t __size) ;
extern int fprintf (FILE *__stream, const char *__format, ...) ;
extern int fscanf (FILE *__stream, const char *__format, ...) ;
extern int printf (const char *__format, ...) ; 
extern int scanf (const char *__format, ...) ;
extern int sprintf (char *__s, const char *__format, ...) ;
extern int sscanf (const char *__s, const char *__format, ...) ;
extern	int vscanf	( const char *__fmt, va_list ) ;
extern	int vfprintf	( FILE *__stream, const char *__fmt, va_list ) ;
extern	int vfscanf	( FILE *__stream, const char *__fmt, va_list ) ;
extern	int vsscanf	(const char *__buf, const char *__fmt, va_list) ;
extern vprintf (const char *__format, va_list __arg) ;
extern int vsprintf (char *__s, const char *__format, va_list __arg) ;
extern int fgetc (FILE *__stream) ;
extern int   ungetc	( int __ch, FILE *__stream ) ;   
extern int   putw	( int __n,  FILE *__stream ) ;   
extern int   getw	( FILE *__stream ) ;	   
extern int fputc (int __c, FILE *__stream) ;
extern int fputs (const char *__s, FILE *__stream) ;
extern char *gets (char *__s) ;
extern char *fgets	( char *__line, int __n, FILE *__stream ) ;
extern int puts (const char *__s) ;
extern size_t fread (_TYP __ptr, size_t __size, size_t __nmemb, FILE *__stream) ;
extern size_t fwrite (const _TYP __ptr, size_t __size, size_t __nmemb, FILE *__stream) ;
extern int fgetpos (FILE *__stream, fpos_t *__pos) ;
extern int fseek (FILE *__stream, long int __offset, int __whence) ;
extern int fsetpos (FILE *__stream, const fpos_t *__pos) ;
extern long int ftell (FILE *__stream) ;
extern void rewind (FILE *__stream) ;
extern int remove (const char *__filename) ;
extern void perror (const char *__s) ;
extern FILE *tmpfile (void) ;
extern char *tmpnam (char *__s) ;
extern int target_flags;
void m88k_options ();
extern char *m88k_tab_align;

extern char *sdbout_scl_str ();		 
extern char *sdbout_type_str ();	 
extern int m88k_prologue_done;
extern void m88k_asm_filter_init ();
extern void m88k_silicon_filter ();
extern void m88k_reorder ();



enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };


extern int function_arg_p();
extern void m88k_function_prologue();
extern int may_call_alloca;
extern int current_function_pretend_args_size;
extern void m88k_function_epilogue();
extern struct rtx_def * m88k_fix_frame_pointer_address();







void output_ls_address ();


extern char *m88k_function_name;

enum rtx_code  {
  UNKNOWN , 
  NIL , 
  EXPR_LIST , 
  INSN_LIST , 
  MATCH_OPERAND , 
  MATCH_DUP , 
  MATCH_OPERATOR , 
  DEFINE_INSN , 
  DEFINE_PEEPHOLE , 
  DEFINE_COMBINE , 
  DEFINE_EXPAND , 
  SEQUENCE , 
  ADDRESS , 
  INSN , 
  JUMP_INSN , 
  CALL_INSN , 
  BARRIER , 
  CODE_LABEL , 
  NOTE , 
  INLINE_HEADER , 
  PARALLEL , 
  ASM_INPUT , 
  ASM_OPERANDS , 
  ADDR_VEC , 
  ADDR_DIFF_VEC , 
  SET , 
  USE , 
  CLOBBER , 
  CALL , 
  RETURN , 
  CONST_INT , 
  CONST_DOUBLE , 
  CONST , 
  PC , 
  REG , 
  SUBREG , 
  STRICT_LOW_PART , 
  MEM , 
  LABEL_REF , 
  SYMBOL_REF , 
  CC0 , 
  QUEUED , 
  IF_THEN_ELSE , 
  COMPARE , 
  PLUS , 
  MINUS , 
  NEG , 
  MULT , 
  DIV , 
  MOD , 
  UMULT , 
  UDIV , 
  UMOD , 
  AND , 
  IOR , 
  XOR , 
  NOT , 
  LSHIFT , 
  ASHIFT , 
  ROTATE , 
  ASHIFTRT , 
  LSHIFTRT , 
  ROTATERT , 
  PRE_DEC , 
  PRE_INC , 
  POST_DEC , 
  POST_INC , 
  NE , 
  EQ , 
  GE , 
  GT , 
  LE , 
  LT , 
  GEU , 
  GTU , 
  LEU , 
  LTU , 
  SIGN_EXTEND , 
  ZERO_EXTEND , 
  TRUNCATE , 
  FLOAT_EXTEND , 
  FLOAT_TRUNCATE , 
  FLOAT , 
  FIX , 
  UNSIGNED_FLOAT , 
  UNSIGNED_FIX , 
  ABS , 
  SQRT , 
  FFS , 
  SIGN_EXTRACT , 
  ZERO_EXTRACT , 
  LAST_AND_UNUSED_RTX_CODE};	 
extern int rtx_length[];
extern char *rtx_name[];
extern char *rtx_format[];
enum machine_mode {
 VOIDmode, 
 QImode, 		 
 HImode, 
 SImode, 
 DImode, 
 TImode, 
 QFmode, 
 HFmode, 		 
 SFmode, 
 DFmode, 
 TFmode, 
 CQImode, 
 CHImode, 	 
 CSImode, 
 CDImode, 
 CTImode, 
 CQFmode, 
 CHFmode, 	 
 CSFmode, 
 CDFmode, 
 CTFmode, 
 BImode, 	 
 BLKmode, 
 EPmode, 
MAX_MACHINE_MODE };
extern char *mode_name[];
enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT,
		  MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_FUNCTION };
extern enum mode_class mode_class[];
extern int mode_size[];
extern int mode_unit_size[];

typedef union rtunion_def
{
  int rtint;
  char *rtstr;
  struct rtx_def *rtx;
  struct rtvec_def *rtvec;
  enum machine_mode rttype;
} rtunion;
typedef struct rtx_def
{
  enum rtx_code code : 16;
  enum machine_mode mode : 8;
  unsigned int jump : 1;
  unsigned int call : 1;
  unsigned int unchanging : 1;
  unsigned int volatil : 1;
  unsigned int in_struct : 1;
  unsigned int used : 1;
  unsigned integrated : 1;
  rtunion fld[1];
} *rtx;
typedef struct rtvec_def{
  unsigned num_elem;		 
  rtunion elem[1];
} *rtvec;

enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
		REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
		REG_NONNEG = 8, REG_ASM_LINE = 9, REG_ASM_FILE = 10 };


extern rtx rtx_alloc ();
extern rtvec rtvec_alloc ();
extern rtx find_reg_note ();
extern rtx gen_rtx ();
extern rtx copy_rtx ();
extern rtvec gen_rtvec ();
extern rtvec gen_rtvec_v ();
extern rtx gen_reg_rtx ();
extern rtx gen_label_rtx ();
extern rtx gen_inline_header_rtx ();
extern rtx gen_lowpart ();
extern rtx gen_highpart ();
extern int subreg_lowpart_p ();
extern rtx make_safe_from ();
extern rtx memory_address ();
extern rtx get_insns ();
extern rtx get_last_insn ();
extern rtx start_sequence ();
extern rtx gen_sequence ();
extern rtx expand_expr ();
extern rtx output_constant_def ();
extern rtx immed_real_const ();
extern rtx immed_real_const_1 ();
extern rtx immed_double_const ();
extern rtx force_const_double_mem ();
extern rtx force_const_mem ();
extern rtx get_parm_real_loc ();
extern rtx assign_stack_local ();
extern rtx protect_from_queue ();
extern void emit_queue ();
extern rtx emit_move_insn ();
extern rtx emit_insn ();
extern rtx emit_jump_insn ();
extern rtx emit_call_insn ();
extern rtx emit_call_insn_before ();
extern rtx emit_insn_before ();
extern rtx emit_insn_after ();
extern rtx emit_label ();
extern rtx emit_barrier ();
extern rtx emit_note ();
extern rtx emit_line_note ();
extern rtx emit_line_note_force ();
extern rtx prev_real_insn ();
extern rtx next_real_insn ();
extern rtx next_nondeleted_insn ();
extern rtx plus_constant ();
extern rtx find_equiv_reg ();
extern rtx delete_insn ();
extern rtx adj_offsetable_operand ();
extern int max_parallel;
extern int asm_noperands ();
extern char *decode_asm_operands ();
extern enum reg_class reg_preferred_class ();
extern rtx get_first_nonparm_insn ();
extern rtx pc_rtx;
extern rtx cc0_rtx;
extern rtx const0_rtx;
extern rtx const1_rtx;
extern rtx fconst0_rtx;
extern rtx dconst0_rtx;
extern rtx stack_pointer_rtx;
extern rtx frame_pointer_rtx;
extern rtx arg_pointer_rtx;
extern rtx struct_value_rtx;
extern rtx struct_value_incoming_rtx;
extern rtx static_chain_rtx;
extern rtx static_chain_incoming_rtx;
extern int max_regno;
extern short *reg_n_refs;
extern short *reg_n_sets;
extern short *reg_n_deaths;
extern int *reg_n_calls_crossed;
extern int *reg_live_length;
extern short *reg_renumber;
extern char regs_ever_live[32 ];
extern char *reg_names[32 ];
extern short *regno_first_uid;
extern short *regno_last_uid;
extern char *regno_pointer_flag;
extern rtx *regno_reg_rtx;
extern int caller_save_needed;
extern int recog_memoized ();
extern void insn_extract ();
extern rtx recog_operand[];
extern rtx *recog_operand_loc[];
extern rtx *recog_dup_loc[];
extern char recog_dup_num[];
extern char *insn_template[];
extern char *(*insn_outfun[]) ();
extern int insn_n_operands[];
extern int insn_n_dups[];
extern int insn_n_alternatives[];
extern char *insn_operand_constraint[][8 ];
extern char insn_operand_address_p[][8 ];
extern enum machine_mode insn_operand_mode[][8 ];
extern char insn_operand_strict_low[][8 ];
extern int (*insn_operand_predicate[][8 ]) ();
typedef struct {int flags; rtx value1, value2; int  mdep;} CC_STATUS;
extern CC_STATUS cc_prev_status;
extern CC_STATUS cc_status;
struct gdbfile
{
  struct gdbfile *next;
  char *name;			 
  int filenum;			 
  int nlines;			 
};
extern struct gdbfile *gdbfiles;
extern char *main_input_filename;
enum debugger { NO_DEBUG = 0, GDB_DEBUG = 1, DBX_DEBUG = 2, SDB_DEBUG = 3,
		EXTENDED_DBX_DEBUG = 4 };
extern enum debugger write_symbols;
extern int use_gdb_dbx_extensions;
extern int optimize;
extern int obey_regdecls;
extern int quiet_flag;
extern int verbose_flag;
extern int inhibit_warnings;
extern int extra_warnings;
extern int warn_unused;
extern int profile_flag;
extern int profile_block_flag;
extern int pedantic;
extern char *cc1_path_name;

extern int flag_caller_saves;
extern int flag_pcc_struct_return;
extern int flag_force_mem;
extern int flag_force_addr;
extern int flag_defer_pop;
extern int flag_float_store;
extern int flag_combine_regs;
extern int flag_strength_reduce;
extern int flag_writable_strings;
extern int flag_no_function_cse;
extern int flag_omit_frame_pointer;
extern int frame_pointer_needed;
extern int flag_no_peephole;
extern int flag_volatile;
extern int flag_inline_functions;
extern int flag_keep_inline_functions;
extern int flag_syntax_only;
extern int flag_shared_data;
extern double ldexp ();
extern double atof ();
union real_extract 
{
  double  d;
  int i[sizeof (double ) / sizeof (int)];
};
void output_asm_insn ();
rtx alter_subreg ();
static int alter_cond ();
void output_asm_label ();
static void output_operand ();
void output_address ();
void output_addr_const ();
static void output_source_line ();
extern int sdb_begin_function_line;
static int last_linenum;
static int count_basic_blocks;
static rtx this_is_asm_operands;
static int insn_noperands;
static char *reg_name[] = {"ap", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",	"r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",	"r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29",	"r30", "r31"} ;
extern FILE *asm_out_file;
int next_block_index;
struct gdbfile *gdbfiles;
static struct gdbfile *current_gdbfile;
static int next_gdb_filenum;
CC_STATUS cc_status;
CC_STATUS cc_prev_status;
static char *lastfile;
char regs_ever_live[32 ];
int frame_pointer_needed;
int profile_label_no;
static int max_block_depth;
static int *pending_blocks;
static int block_depth;
static int app_on;


void
final (first, file, write_symbols, optimize, prescan)
     rtx first;
     FILE *file;
     enum debugger write_symbols;
     int optimize;
     int prescan;
{
  register rtx insn;
  register int i;
  rtx last_ignored_compare = 0;
  int new_block = 1;
  init_recog ();
  (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
  for (insn = ((first)->fld[2].rtx) ; insn; insn = ((insn)->fld[2].rtx) )
    {
      switch (	((insn)->code) )
	{
	case NOTE:
	  if (prescan > 0)
	    break;
	  if (write_symbols == NO_DEBUG)
	    break;
	  if (((insn)->fld[4].rtint)  == 0 )
	    abort ();		 
	  if (((insn)->fld[4].rtint)  == -4 
	      || ((insn)->fld[4].rtint)  == -5 )
	    break;
	  if (((insn)->fld[4].rtint)  == -1 )
	    break;		 
	  if (app_on)
	    {
	      fprintf (file, "" );
	      app_on = 0;
	    }
	  if (((insn)->fld[4].rtint)  == -2 )
	    {
	      if (block_depth == max_block_depth)
		{
		  max_block_depth *= 2;
		  pending_blocks
		    = (int *) xrealloc (pending_blocks,
					max_block_depth * sizeof (int));
		}
	      pending_blocks[block_depth++] = next_block_index;
	      if (write_symbols == SDB_DEBUG)
		sdbout_begin_block (file, last_linenum, next_block_index);
	      if (write_symbols == GDB_DEBUG)
		fprintf (file, "\t.gdbbeg %d\n", next_block_index);
	      next_block_index++;
	    }
	  else if (((insn)->fld[4].rtint)  == -3 )
	    {
	      --block_depth;
	      if (write_symbols == SDB_DEBUG && block_depth >= 0)
		sdbout_end_block (file, last_linenum);
	      if (write_symbols == GDB_DEBUG)
		fprintf (file, "\t.gdbend %d\n", pending_blocks[block_depth]);
	    }
	  else if (((insn)->fld[4].rtint)  > 0)
	    output_source_line (file, insn, write_symbols);
	  break;
	case BARRIER:
	  break;
	case CODE_LABEL:
	  (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
	  if (prescan > 0)
	    break;
	  new_block = 1;
	  if (app_on)
	    {
	      fprintf (file, "" );
	      app_on = 0;
	    }
	  do {	if (  (target_flags & 0x00000200	)  &&	 "L"[0] == 'L' &&  "L"[1] == '\0' &&	m88k_function_name != (char *)0)	fprintf (file, "@%s%d.%s:\n",  "L",  ((insn)->fld[3].rtint) , m88k_function_name);	else	fprintf (file, "@%s%d:\n",  "L",  ((insn)->fld[3].
rtint) );	} while (0) ;
	  break;
	default:
	  {
	    register rtx body = ((insn)->fld[3].rtx) ;
	    int insn_code_number;
	    char *template;
	    if (	((body)->code)  == USE  
		|| 	((body)->code)  == CLOBBER)
	      break;
	    if (profile_block_flag && new_block)
	      {
		new_block = 0;
		do {	if (  (target_flags & 0x00000200	)  &&	 "LPB"[0] == 'L' &&  "LPB"[1] == '\0' &&	m88k_function_name != (char *)0)	fprintf (file, "@%s%d.%s:\n",  "LPB",  count_basic_blocks, m88k_function_name);	else	fprintf (file, "@%s%d:\n",  "LPB",  count_basic_bl
ocks);	} while (0) ;
		count_basic_blocks++;
	      }
	    if (	((body)->code)  == ASM_INPUT)
	      {
		(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
		if (prescan > 0)
		  break;
		if (! app_on)
		  {
		    fprintf (file, "" );
		    app_on = 1;
		  }
		fprintf (asm_out_file, "\t%s\n", ((body)->fld[ 0].rtstr) );
		break;
	      }
	    if (asm_noperands (body) >= 0)
	      {
		int noperands = asm_noperands (body);
		rtx *ops;
		char *string;
		(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
		if (prescan > 0)
		  break;
		if (noperands > 0)
		  ops = (rtx *) xmalloc (noperands * sizeof (rtx));
		if (! app_on)
		  {
		    fprintf (file, "" );
		    app_on = 1;
		  }
		string = decode_asm_operands (body, ops, 0, 0, 0);
		insn_noperands = noperands;
		this_is_asm_operands = insn;
		output_asm_insn (string, ops);
		this_is_asm_operands = 0;
		if (noperands > 0)
		  free (ops);
		break;
	      }
	    if (prescan <= 0 && app_on)
	      {
		fprintf (file, "" );
		app_on = 0;
	      }
	    if (	((body)->code)  == ADDR_VEC)
	      {
		register int vlen, idx;
		if (prescan > 0)
		  break;
		vlen = ((body)->fld[ 0].rtvec->num_elem) ;
		for (idx = 0; idx < vlen; idx++)
		  do {	char buffer[256];	do {	if (  (target_flags & 0x00000200	)  &&	 "L"[0] == 'L' &&  "L"[1] == '\0' &&	m88k_function_name != (char *)0)	sprintf (buffer, "*@%s%d.%s",  "L",  
			   ((((((body)->fld[ 0].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name);	else	sprintf (buffer, "*@%s%d",  "L",  
			   ((((((body)->fld[ 0].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) );	} while (0) ;	fprintf (file, "\tbr%s %s\n", m88k_tab_align, &buffer[1]);	} while (0) ;
		break;
	      }
	    if (	((body)->code)  == ADDR_DIFF_VEC)
	      {
		register int vlen, idx;
		if (prescan > 0)
		  break;
		vlen = ((body)->fld[ 1].rtvec->num_elem) ;
		for (idx = 0; idx < vlen; idx++)
		  do {	char buf1[256], buf2[256];	do {	if (  (target_flags & 0x00000200	)  &&	 "L"[0] == 'L' &&  "L"[1] == '\0' &&	m88k_function_name != (char *)0)	sprintf (buf1, "*@%s%d.%s",  "L",  
			   ((((((body)->fld[ 1].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name);	else	sprintf (buf1, "*@%s%d",  "L",  
			   ((((((body)->fld[ 1].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) );	} while (0) ;	do {	if (  (target_flags & 0x00000200	)  &&	 "L"[0] == 'L' &&  "L"[1] == '\0' &&	m88k_function_name != (char *)0)	sprintf (buf2, "*@%s%d.%s",  "L",  
			   ((((((body)->fld[ 0].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name);	else	sprintf (buf2, "*@%s%d",  "L",  
			   ((((((body)->fld[ 0].rtx) )->fld[ 0].rtx) )->fld[3].rtint) );	} while (0) ;	fprintf (file, "\tword%s %s-%s\n", m88k_tab_align, &buf1[1], &buf2[1]); } while (0) ;
		break;
	      }
	    body = ((insn)->fld[3].rtx) ;
	    if (optimize
		&& 	((body)->code)  == SET
		&& 	((((body)->fld[0].rtx) )->code)  == CC0)
	      {
		if (	((((body)->fld[1].rtx) )->code)  == SUBREG)
		  ((body)->fld[1].rtx)  = alter_subreg (((body)->fld[1].rtx) );
		if ((cc_status.value1 != 0
		     && rtx_equal_p (((body)->fld[1].rtx) , cc_status.value1))
		    || (cc_status.value2 != 0
			&& rtx_equal_p (((body)->fld[1].rtx) , cc_status.value2)))
		  {
		    if (! find_reg_note (insn, REG_INC, 0)
			&& ! volatile_refs_p (((insn)->fld[3].rtx) ))
		      {
			last_ignored_compare = insn;
			break;
		      }
		  }
	      }
	  reinsert_compare:
	    if (	((insn)->code)  == JUMP_INSN && 	((body)->code)  == SET
		&& 	((((body)->fld[1].rtx) )->code)  != LABEL_REF)
	      new_block = 1;
	    if (cc_status.flags != 0
		&& 	((insn)->code)  == JUMP_INSN
		&& 	((body)->code)  == SET
		&& ((body)->fld[0].rtx)  == pc_rtx
		&& 	((((body)->fld[1].rtx) )->code)  == IF_THEN_ELSE
		&& prescan >= 0)
	      {
		register int result = alter_cond (((((body)->fld[1].rtx) )->fld[ 0].rtx) );
		if (result == 1)
		  ((body)->fld[1].rtx)  = ((((body)->fld[1].rtx) )->fld[ 1].rtx) ;
		if (result == -1)
		  ((body)->fld[1].rtx)  = ((((body)->fld[1].rtx) )->fld[ 2].rtx) ;
		if (((body)->fld[1].rtx)  == pc_rtx)
		  {
		    ((insn)->code = ( NOTE)) ;
		    ((insn)->fld[4].rtint)  = -1 ;
		     ((insn)->fld[3].rtstr)  = 0;
		    break;
		  }
		if (result != 0)
		  ((insn)->fld[4].rtint)  = -1;
	      }
	    if (cc_status.flags != 0
		&& 	((body)->code)  == SET)
	      switch (	((((body)->fld[1].rtx) )->code) )
		{
		case GTU:
		case GT:
		case LTU:
		case LT:
		case GEU:
		case GE:
		case LEU:
		case LE:
		case EQ:
		case NE:
		  {
		    register int result;
		    if (	((((((body)->fld[1].rtx) )->fld[ 0].rtx) )->code)  != CC0)
		      break;
		    result = alter_cond (((body)->fld[1].rtx) );
		    if (result == 1)
		      ((body)->fld[1].rtx)  = gen_rtx (CONST_INT, VOIDmode,
						1 );
		    if (result == -1)
		      ((body)->fld[1].rtx)  = const0_rtx;
		    if (result != 0)
		      ((insn)->fld[4].rtint)  = -1;
		  }
		}
	    if (optimize && !flag_no_peephole)
	      {
		peephole (insn);
		body = ((insn)->fld[3].rtx) ;
	      }
	    insn_code_number = recog_memoized (insn);
	    insn_extract (insn);
	    for (i = 0; i < insn_n_operands[insn_code_number]; i++)
	      {
		if (	((recog_operand[i])->code)  == SUBREG)
		  recog_operand[i] = alter_subreg (recog_operand[i]);
	      }
	    if (! constrain_operands (insn_code_number))
	      abort ();
	    cc_prev_status = cc_status;
	    { if (	((body)->code)  == SET)	{ if (	((((body)->fld[0].rtx) )->code)  == CC0)	{ cc_status.flags = 0;	cc_status.value1 = ((body)->fld[0].rtx) ;	cc_status.value2 = ((body)->fld[1].rtx) ;	}	else if (	((((body)->fld[1].rtx) )->code)  == CALL)	{ (cc_stat
us.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; }	else if (	((((body)->fld[0].rtx) )->code)  == R
EG)	{ if (cc_status.value1	&& reg_overlap_mentioned_p (((body)->fld[0].rtx) , cc_status.value1)) cc_status.value1 = 0;	if (cc_status.value2	&& reg_overlap_mentioned_p (((body)->fld[0].rtx) , cc_status.value2)) cc_status.value2 = 0;	}	else if (	((((body)->
fld[0].rtx) )->code)  == MEM)	{	int i = cc_status.mdep & (0x00000001	 | 0x00000002	 | 0x00000004	) ;	(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set 
when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;	cc_status.mdep = i;	}	}	else if (	((body)->code)  == PARALLEL	&& 	((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->code)  == SET)	{ if (	((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code
)  == CC0)	{ cc_status.flags = 0;	cc_status.value1 = ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) ;	cc_status.value2 = ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[1].rtx) ;	}	else if (	((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[1].rtx) 
)->code)  == CALL) {   (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; }	else if (	((((((
body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code)  == REG) { if (cc_status.value1	&& reg_overlap_mentioned_p (((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) , cc_status.value1)) cc_status.value1 = 0;	if (cc_status.value2	&& reg_overlap_m
entioned_p (((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) , cc_status.value2)) cc_status.value2 = 0;	}	else if (	((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code)  == MEM) {	int i = cc_status.mdep & (0x00000001	 | 0x00000002	 | 0x
00000004	) ;	(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_
status.mdep = 0) ) ;	cc_status.mdep = i;	}	}	else if (	((body)->code)  == PARALLEL	&& 	((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->code)  == REG)	{ (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? 
warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; }	else if (	((body)->code)  == CALL)	{   (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002	) != 0) ? 
warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; }	} ;
	    template = insn_template[insn_code_number];
	    if (template == 0)
	      {
		template = (*insn_outfun[insn_code_number]) (recog_operand, insn);
		if (template == 0)
		  {
		    if (((insn)->fld[1].rtx)  != last_ignored_compare)
		      abort ();
		    insn = ((insn)->fld[1].rtx) ;
		    body = ((insn)->fld[3].rtx) ;
		    new_block = 0;
		    goto reinsert_compare;
		  }
	      }
	    if (prescan > 0)
	      break;
	    output_asm_insn (template, recog_operand);
	    ((insn)->volatil)  = 1;
	  }
	}
    }
}