[gnu.gcc.bug] abort

eirik@labs.labs.tek.com (Eirik Fuller) (10/15/89)

For gcc-1.36 configured via "config.gcc sun4-os4":

The enclosed file (window.c) causes an abort in gcc-cc1 at an
unrecognized instruction when compiled with -O -finline-functions

(gdb) r -O -finline-functions -quiet window.c
Starting program: /free/gnu/gcc-sun4/cc1 -O -finline-functions -quiet window.c
window.c: In function Fscroll_down:
window.c:242: The following insn was not recognizable:
(insn/i 25 24 26 (parallel[ 
           (set (reg:SI 75)
               (neg:SI (reg:SI 74)))
           (clobber (reg:SI 8))
           (clobber (reg:SI 9))
           (clobber (reg:SI 12))
           (clobber (reg:SI 13))
       ] ) -1 (insn_list 24 (nil))
   (expr_list:REG_DEAD (reg:SI 74)
       (expr_list:REG_DEAD (reg:SI 8)
           (expr_list:REG_DEAD (reg:SI 9)
               (expr_list:REG_DEAD (reg:SI 12)
                   (expr_list:REG_DEAD (reg:SI 13)
                       (nil)))))))

Bpt 1, #0  0xdde64 in abort ()
#1  0x23070 in fatal_insn_not_found (insn=(rtx) 0x1113b0) (toplev.c line 481)
(gdb) p insn
$8 = (rtx) 0x1113b0
(gdb) prc
INSN (VOIDmode)
(gdb) pi
$9 = {0x19, 0x111370, 0x111430, 0x1113d0, 0xffffffff, 0x111f08, 0x111ef8}
#2  0xc9c98 in insn_extract (insn=(rtx) 0x1113b0) (insn-extract.c line 1375)
#3  0x9ae5c in regclass (f=(rtx) 0x110f20, nregs=87) (regclass.c line 402)
(gdb) l
397		  }
398		else
399		  {
400		    int insn_code_number = recog_memoized (insn);
401	
402		    insn_extract (insn);
403	
404		    for (i = insn_n_operands[insn_code_number] - 1; i >= 0; i--)
405		      reg_class_record (recog_operand[i], i,
406					insn_operand_constraint[insn_code_number]);
(gdb) p f
$10 = (rtx) 0x110f20
(gdb) prc
NOTE (VOIDmode)
(gdb) pi
$11 = {0x2, 0x0, 0x111080, 0x0, 0xffffffff, 0x220400, 0x56}
(gdb) 

Here, condensed from preprocessed GNU emacs sources, is window.c:

struct buffer_text
  {
    unsigned char *p1;
    unsigned char *p2;
    int size1;
    int size2;
    int gap;
    int modified;
    int head_clip;
    int tail_clip;
    int pointloc;
  };
struct buffer
  {
    struct buffer_text text;
    struct buffer *next;
    int local_var_flags;
    int save_modified;
    int modtime;
    int auto_save_modified;
    int last_window_start;
    struct UndoData *undodata;
    struct Lisp_Vector *syntax_table_v;
    int  markers;
    int  name;
    int  filename;
    int  directory;
    int  backed_up;
    int  save_length;
    int  auto_save_file_name;
    int  read_only;
    int  mark;
    int  local_var_alist;
    int  major_mode;
    int  mode_name;
    int  mode_line_format;
    int  keymap;
    int  abbrev_table;
    int  case_fold_search;
    int  tab_width;
    int  fill_column;
    int  left_margin;
    int  auto_fill_hook;
    int  truncate_lines;
    int  ctl_arrow;
    int  selective_display;
    int  selective_display_ellipses;
    int  minor_modes;
    int  overwrite_mode;
    int  abbrev_mode;
};
enum Lisp_Type
  {
    Lisp_Int,
    Lisp_Symbol,
    Lisp_Marker,
    Lisp_String,
    Lisp_Vector,
    Lisp_Cons,
    Lisp_Object_Unused_1,
    Lisp_Buffer,
    Lisp_Subr,
    Lisp_Internal,
    Lisp_Intfwd,
    Lisp_Boolfwd,
    Lisp_Process,
    Lisp_Objfwd,
    Lisp_Object_Unused_2,
    Lisp_Internal_Stream,
    Lisp_Buffer_Local_Value,
    Lisp_Some_Buffer_Local_Value,
    Lisp_Buffer_Objfwd,
    Lisp_Void,
    Lisp_Window,
    Lisp_Window_Configuration
  };
struct position
  {
    int bufpos;
    int hpos;
    int vpos;
    int prevhpos;
    int contin;
  };
struct position *compute_motion ();
extern int  Qt, Qnil, Qbeginning_of_buffer, Qend_of_buffer, Qminus,
  selected_window, minibuf_window, Qinteger_or_marker_p;
int next_screen_context_lines, Qwindowp;
extern struct buffer_text bf_text;
extern struct buffer *bf_cur;
struct window
  {
    int size;
    struct Lisp_Vector *vec_next;
    int  next;
    int  prev;
    int  hchild, vchild;
    int  parent;
    int  left;
    int  top;
    int  height;
    int  width;
    int  buffer;
    int  start;
    int  pointm;
    int  force_start;
    int  hscroll;
    int  use_time;
    int  sequence_number;
    int  temslot;
    int  last_modified;
    int  last_point;
    int  last_point_x;
    int  last_point_y;
    int  last_mark_x;
    int  last_mark_y;
    int  window_end_pos;
    int  window_end_valid;
    int  window_end_vpos;
    int  redo_mode_line;
    int  start_at_line_beg;
  };
int   Fpos_visible_in_window_p
  (pos, window)
     int  pos, window;
{
  register struct window *w;
  register int top;
  register int height;
  register int posint;
  register struct buffer_text *text;
  struct position posval;
  if ( ((pos)  == (Qnil) ) )
    posint = bf_text.pointloc ;
  else
    {
      { if (((enum Lisp_Type) (((pos)) >> 24 ))  == Lisp_Marker) (pos)  = marker_position (pos); else if (((enum Lisp_Type) (((pos)) >> 24 ))  != Lisp_Int) pos = wrong_type_argument (Qinteger_or_marker_p, (pos)); } ;
      posint = (((pos) << 32		-24 ) >> 32		-24 ) ;
    }
  if ( ((window)  == (Qnil) ) )
    window = selected_window;
  else
    { if (((enum Lisp_Type) (((window)) >> 24 ))  != Lisp_Window) window = wrong_type_argument (Qwindowp, (window)); } ;
  w = ((struct window *) ((window) & ((1<<24 ) - 1) )  ) ;
  top = marker_position (w->start);
  if (posint < top)
    return Qnil;
  height = (w->height)  - !((window)  == ( minibuf_window) ) ;
  bf_cur->text = bf_text;
  text = &((struct buffer *) ((w->buffer) & ((1<<24 ) - 1) )  ) ->text;
  if ((w->last_modified)  >= text->modified)
    {
      if (posint < text->size1 + text->size2 + 1 - (w->window_end_pos)
	  || ((w->window_end_vpos)  < height))
	return Qt;
      return Qnil;
    }
  else
    {
      if (posint > text->size1 + text->size2 + 1)
	return Qnil;
      posval = *compute_motion (top, 0, 0,
			       posint, height, 0,
			       (w->width)  - 1
			       - ((w->width)  + (w->left)  != (((struct window *) ((minibuf_window) & ((1<<24 ) - 1) )  ) ->width) ),
			       (((w->hscroll) << 32		-24 ) >> 32		-24 ) , 0);
      return posval.vpos < height ? Qt : Qnil;
    }
}
static
window_scroll (window, n)
     int  window;
     int n;
{
  register struct window *w = ((struct window *) ((window) & ((1<<24 ) - 1) )  ) ;
  register int opoint = bf_text.pointloc ;
  register int ht, pos;
  register int  tem;
  int lose;
  int  bolp;
  ht = (w->height)  - !((window)  == ( minibuf_window) ) ;
  (tem)  = bf_text.pointloc ;
  tem = Fpos_visible_in_window_p (tem, window);
  if ( ((tem)  == (Qnil) ) )
    {
      Fvertical_motion (make_number (- ht / 2));
      (tem)  = bf_text.pointloc ;
      Fset_marker (w->start, tem, w->buffer);
      w->force_start = Qt;
    }
   bf_text.pointloc  =  (marker_position (w->start));
  lose = n < 0 && bf_text.pointloc  == bf_text.head_clip ;
  Fvertical_motion (make_number (n));
  pos = bf_text.pointloc ;
  bolp = Fbolp ();
   bf_text.pointloc  =  (opoint);
  if (lose)
    Fsignal (Qbeginning_of_buffer, Qnil);
  if (pos < (bf_text.size1+bf_text.size2-bf_text.tail_clip)  + 1)
    {
      Fset_marker (w->start, make_number (pos), w->buffer);
      w->start_at_line_beg = bolp;
      w->redo_mode_line = Qt;
      (w->last_modified)  = 0;
      if (pos > opoint)
	 bf_text.pointloc  =  (pos);
      if (n < 0)
	{
	   bf_text.pointloc  =  (pos);
	  tem = Fvertical_motion (make_number (ht));
	  if (bf_text.pointloc  > opoint || (tem)  < ht)
	     bf_text.pointloc  =  (opoint);
	  else
	    Fvertical_motion (make_number (-1));
	}
    }
  else
    Fsignal (Qend_of_buffer, Qnil);
}
scroll_command (n, direction)
     register int  n;
     int direction;
{
  register int defalt
    = direction * (window_height (selected_window) - 1
		   - next_screen_context_lines);
  if ( ((n)  == (Qnil) ) )
    window_scroll (selected_window, defalt);
  else if (((n)  == ( Qminus) ) )
    window_scroll (selected_window, - defalt);
  else
    {
      n = Fprefix_numeric_value (n);
      window_scroll (selected_window, (((n) << 32		-24 ) >> 32		-24 )  * direction);
    }
}
int   Fscroll_down (n)
     int  n;
{
  scroll_command (n, -1);
  return Qnil;
}