This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[new-regalloc-branch] bugfix. Keep basic block info up to date



I have successfully bootstrapped (i386) C and C++ with the following changes.

Sat Apr  6 12:40:44 2002  Denis Chertykov  <denisc@overta.ru>

	* pre-reload.c (emit_pre_reload_insns): Don't try to keep basic
	block info.
	(pre_reload_collect): Keep basic block info up to date.


Index: pre-reload.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/Attic/pre-reload.c,v
retrieving revision 1.1.2.2
diff -c -3 -p -r1.1.2.2 pre-reload.c
*** pre-reload.c	2002/03/16 11:53:44	1.1.2.2
--- pre-reload.c	2002/04/06 08:41:45
*************** emit_pre_reload_insns (insn)
*** 762,768 ****
  {
    int j;
    rtx following_insn = NEXT_INSN (insn);
-   rtx before_insn = PREV_INSN (insn);
  
    for (j = 0; j < n_reloads; ++j)
      {
--- 762,767 ----
*************** emit_pre_reload_insns (insn)
*** 884,899 ****
        emit_insns_before (output_reload_insns[j], following_insn);
        emit_insns_before (other_output_reload_insns[j], following_insn);
      }
- 
-   /* Keep basic block info up to date.  */
-   if (n_basic_blocks)
-     {
-       basic_block bb = BLOCK_FOR_INSN (insn);
-       if (bb->head  == insn)
- 	bb->head = NEXT_INSN (before_insn);
-       if (bb->end == insn)
- 	bb->end = PREV_INSN (following_insn);
-     }
  }
  
  
--- 883,888 ----
*************** pre_reload_collect (ra_info)
*** 3822,3827 ****
--- 3811,3818 ----
  {
    rtx insn;
    int cnt;
+   int block;
+   
    ra_ref *def_refs[(sizeof (ra_ref *)
  		    * MAX_RECOG_OPERANDS * MAX_REGS_PER_ADDRESS + 1)];
    ra_ref *use_refs[(sizeof (ra_ref *)
*************** pre_reload_collect (ra_info)
*** 3830,3892 ****
    cnt = get_max_uid ();
    cnt += cnt / 5;
    
!   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
!     {
!       enum rtx_code pat_code;
!       enum rtx_code code = GET_CODE (insn);
!       rtx prev;
!       rtx next;
  
!       ra_info_add_insn_refs (ra_info, insn, NULL);
        
!       if (GET_RTX_CLASS (code) != 'i')
! 	continue;
  
!       pat_code = GET_CODE (PATTERN (insn));
!       if (pat_code == USE
! 	  || pat_code == CLOBBER
! 	  || pat_code == ASM_INPUT
! 	  || pat_code == ADDR_VEC
! 	  || pat_code == ADDR_DIFF_VEC)
! 	continue;
  
!       cnt = 0;
        
!       next = NEXT_INSN (insn);
!       prev = PREV_INSN (insn);
!       while (1)
! 	{
! 	  int n_defs;
! 	  int n_uses;
! 
! 	  ra_info_add_insn_refs (ra_info, insn, NULL);
! 	  collect_insn_info (insn, def_refs, use_refs, &n_defs, &n_uses);
! 	  if (++cnt > 30)
! 	    abort ();
! 	  if (n_reloads)
! 	    {
! 	      emit_pre_reload_insns (insn);
! 	      subst_pre_reloads (insn);
! 	      insn = NEXT_INSN (prev);
! 	      continue;
! 	    }
  
- 	  if (n_defs || n_uses)
- 	    {
- 	      struct ra_refs *insn_refs;
- 	      insn_refs = build_ra_refs_for_insn (ra_info, def_refs, use_refs,
- 						  n_defs, n_uses);
- 	      ra_info_add_insn_refs (ra_info, insn, insn_refs);
- 	      ra_info_add_reg_refs (ra_info, insn, insn_refs);
- 	    }
- 	  else
  	    ra_info_add_insn_refs (ra_info, insn, NULL);
  
! 	  if (NEXT_INSN (insn) == next)
! 	    break;
! 	  insn = NEXT_INSN (insn);
! 	}
!     }
    
    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
      {
--- 3821,3895 ----
    cnt = get_max_uid ();
    cnt += cnt / 5;
    
!   for (block = 0; block < n_basic_blocks; ++block)
!     for (insn = BLOCK_HEAD (block);
! 	 insn && PREV_INSN (insn) != BLOCK_END (block);
! 	 insn = NEXT_INSN (insn))
!       {
! 	enum rtx_code pat_code;
! 	enum rtx_code code = GET_CODE (insn);
! 	rtx prev;
! 	rtx next;
! 	rtx orig_insn;
  
! 	ra_info_add_insn_refs (ra_info, insn, NULL);
        
! 	if (GET_RTX_CLASS (code) != 'i')
! 	  continue;
  
! 	pat_code = GET_CODE (PATTERN (insn));
! 	if (pat_code == USE
! 	    || pat_code == CLOBBER
! 	    || pat_code == ASM_INPUT
! 	    || pat_code == ADDR_VEC
! 	    || pat_code == ADDR_DIFF_VEC)
! 	  continue;
  
! 	cnt = 0;
        
! 	next = NEXT_INSN (insn);
! 	prev = PREV_INSN (insn);
! 	orig_insn = insn;
! 	while (1)
! 	  {
! 	    int n_defs;
! 	    int n_uses;
  
  	    ra_info_add_insn_refs (ra_info, insn, NULL);
+ 	    collect_insn_info (insn, def_refs, use_refs, &n_defs, &n_uses);
+ 	    if (++cnt > 30)
+ 	      abort ();
+ 	    if (n_reloads)
+ 	      {
+ 		emit_pre_reload_insns (insn);
+ 		subst_pre_reloads (insn);
+ 		insn = NEXT_INSN (prev);
+ 		continue;
+ 	      }
  
! 	    if (n_defs || n_uses)
! 	      {
! 		struct ra_refs *insn_refs;
! 		insn_refs = build_ra_refs_for_insn (ra_info,
! 						    def_refs, use_refs,
! 						    n_defs, n_uses);
! 		ra_info_add_insn_refs (ra_info, insn, insn_refs);
! 		ra_info_add_reg_refs (ra_info, insn, insn_refs);
! 	      }
! 	    else
! 	      ra_info_add_insn_refs (ra_info, insn, NULL);
! 
! 	    if (NEXT_INSN (insn) == next)
! 	      break;
! 	    insn = NEXT_INSN (insn);
! 	  }
! 	
! 	/* Keep basic block info up to date.  */
! 	if (BLOCK_HEAD (block) == orig_insn)
! 	  BLOCK_HEAD (block) = NEXT_INSN (prev);
! 	if (BLOCK_END (block) == orig_insn)
! 	  BLOCK_END (block) = PREV_INSN (next);
!       }
    
    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
      {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]