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]

Move RTL datastructures out of CFG


Hi,
after my CFG inlienr commits, memory consumption went noticeably up, especially
if you measure peak memory usage (ie maximal GGC reachable memory at a given
time) that regressed by roughly 30% on Gerald's testcase.  The major new memory
consumers are basic blocks and statement annotations.  So I would like to
reduce these datastructures somewhat.  We currently have a lot of
datastructures allocated for whole program at once that are not needed for
anything but currently compiled function.

This patch splits out the RTL data to it's own structure allocated only at RTL
time saving roughtly 6% in my statistics.  If we make progress on the tree RBI
I definitly sent patch for but I don't seem to be able to find it in the
archives, so I will re-send it shortly.  We can further move the current fields
of RBI structure into rtl_bb_info and avoid allocating/deallocating it
periodically.  Overall the saivngs are about 13%, so almost half a way back
(and I have some other patches to get memory usage all the way back already
too, but some definitly needs some discussion)...

Patch is from 90% the boring renaming stuff, I've arranged it in a way so
files with nontrivial change scomes first (see changelog)

Bootstrapped/regtested i686-pc-gnu-linux with no slowdown (looks like 80 sec
speedup but this is within noise factor), OK?

Honza

2005-06-10  Jan Hubicka  <jh@suse.cz>
	* basic-block.h (rtl_bb_info): Break out head_, end_,
	global_live_at_start, global_live_at_end from ...
	(basic_block_def): ... here; update all references
	(BB_RTL): New flag.
	(init_rtl_bb_info): Declare.
	* cfgexpand.c (expand_gimple_basic_block): Init bb info, set BB_RTL
	flag.
	* cfgrtl.c: Include ggc.h
	(create_basic_block_structure): Init bb info.
	(rtl_verify_flow_info_1): Check BB_RTL flag and rtl_bb_info pointer.
	(init_rtl_bb_info): New function.
	(rtl_merge_block, cfglayout_merge_block): Copy global_live_at_end here.
	* cfghooks.c (merge_block): Do not copy global_live_at_end here.
	* cfg.c (clear_bb_flags): Skip BB_RTL flag.
	(dump_flow_info): Gueard global_live_* dumping.

Index: basic-block.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/basic-block.h,v
retrieving revision 1.263
diff -c -3 -p -r1.263 basic-block.h
*** basic-block.h	4 Jun 2005 17:07:55 -0000	1.263
--- basic-block.h	10 Jun 2005 12:09:53 -0000
*************** struct loops;
*** 183,188 ****
--- 183,189 ----
  
  /* Declared in tree-flow.h.  */
  struct edge_prediction;
+ struct rtl_bb_info;
  
  /* A basic block is a sequence of instructions with only entry and
     only one exit.  If any one of the instructions are executed, they
*************** struct edge_prediction;
*** 212,221 ****
  /* Basic block information indexed by block number.  */
  struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")))
  {
-   /* The first and last insns of the block.  */
-   rtx head_;
-   rtx end_;
- 
    /* Pointers to the first and last trees of the block.  */
    tree stmt_list;
  
--- 213,218 ----
*************** struct basic_block_def GTY((chain_next (
*** 223,234 ****
    VEC(edge,gc) *preds;
    VEC(edge,gc) *succs;
  
-   /* The registers that are live on entry to this block.  */
-   bitmap GTY ((skip (""))) global_live_at_start;
- 
-   /* The registers that are live on exit from this block.  */
-   bitmap GTY ((skip (""))) global_live_at_end;
- 
    /* Auxiliary info specific to a pass.  */
    PTR GTY ((skip (""))) aux;
  
--- 220,225 ----
*************** struct basic_block_def GTY((chain_next (
*** 245,250 ****
--- 236,245 ----
    /* The data used by basic block copying and reordering functions.  */
    struct reorder_block_def * rbi;
  
+   union basic_block_il_dependent {
+       struct rtl_bb_info * GTY ((tag ("1"))) rtl;
+     } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
+ 
    /* Chain of PHI nodes for this block.  */
    tree phi_nodes;
  
*************** struct basic_block_def GTY((chain_next (
*** 267,272 ****
--- 262,280 ----
    int flags;
  };
  
+ struct rtl_bb_info GTY(())
+ {
+   /* The first and last insns of the block.  */
+   rtx head_;
+   rtx end_;
+ 
+   /* The registers that are live on entry to this block.  */
+   bitmap GTY ((skip (""))) global_live_at_start;
+ 
+   /* The registers that are live on exit from this block.  */
+   bitmap GTY ((skip (""))) global_live_at_end;
+ };
+ 
  typedef struct basic_block_def *basic_block;
  
  /* Structure to hold information about the blocks during reordering and
*************** enum
*** 332,338 ****
    BB_HOT_PARTITION = 64,
  
    /* Set on blocks that should be put in a cold section.  */
!   BB_COLD_PARTITION = 128
  };
  
  /* Dummy flag for convenience in the hot/cold partitioning code.  */
--- 340,349 ----
    BB_HOT_PARTITION = 64,
  
    /* Set on blocks that should be put in a cold section.  */
!   BB_COLD_PARTITION = 128,
! 
!   /* Set on blocks that are in RTL format.  */
!   BB_RTL = 256
  };
  
  /* Dummy flag for convenience in the hot/cold partitioning code.  */
*************** extern bitmap_obstack reg_obstack;
*** 462,469 ****
  
  /* Stuff for recording basic block info.  */
  
! #define BB_HEAD(B)      (B)->head_
! #define BB_END(B)       (B)->end_
  
  /* Special block numbers [markers] for entry and exit.  */
  #define ENTRY_BLOCK (-1)
--- 473,480 ----
  
  /* Stuff for recording basic block info.  */
  
! #define BB_HEAD(B)      (B)->il.rtl->head_
! #define BB_END(B)       (B)->il.rtl->end_
  
  /* Special block numbers [markers] for entry and exit.  */
  #define ENTRY_BLOCK (-1)
*************** extern edge try_redirect_by_replacing_ju
*** 983,988 ****
--- 994,1000 ----
  extern void break_superblocks (void);
  extern void check_bb_profile (basic_block, FILE *);
  extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
+ extern void init_rtl_bb_info (basic_block);
  
  #include "cfghooks.h"
  
Index: cfgexpand.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgexpand.c,v
retrieving revision 2.41
diff -c -3 -p -r2.41 cfgexpand.c
*** cfgexpand.c	4 Jun 2005 17:22:16 -0000	2.41
--- cfgexpand.c	10 Jun 2005 12:09:54 -0000
*************** expand_gimple_basic_block (basic_block b
*** 1056,1061 ****
--- 1056,1064 ----
  	       bb->index);
      }
  
+   init_rtl_bb_info (bb);
+   bb->flags |= BB_RTL;
+ 
    if (!bsi_end_p (bsi))
      stmt = bsi_stmt (bsi);
  
*************** construct_init_block (void)
*** 1162,1167 ****
--- 1165,1174 ----
  
    /* Multiple entry points not supported yet.  */
    gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1);
+   init_rtl_bb_info (ENTRY_BLOCK_PTR);
+   init_rtl_bb_info (EXIT_BLOCK_PTR);
+   ENTRY_BLOCK_PTR->flags |= BB_RTL;
+   EXIT_BLOCK_PTR->flags |= BB_RTL;
  
    e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
  
Index: cfgrtl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgrtl.c,v
retrieving revision 1.175
diff -c -3 -p -r1.175 cfgrtl.c
*** cfgrtl.c	6 Jun 2005 12:31:33 -0000	1.175
--- cfgrtl.c	10 Jun 2005 12:09:54 -0000
*************** Software Foundation, 59 Temple Place - S
*** 58,63 ****
--- 58,64 ----
  #include "expr.h"
  #include "target.h"
  #include "cfgloop.h"
+ #include "ggc.h"
  
  static int can_delete_note_p (rtx);
  static int can_delete_label_p (rtx);
*************** create_basic_block_structure (rtx head, 
*** 273,278 ****
--- 274,280 ----
  
        bb = alloc_block ();
  
+       init_rtl_bb_info (bb);
        if (!head && !end)
  	head = end = bb_note
  	  = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
*************** create_basic_block_structure (rtx head, 
*** 300,306 ****
    BB_HEAD (bb) = head;
    BB_END (bb) = end;
    bb->index = last_basic_block++;
!   bb->flags = BB_NEW;
    link_block (bb, after);
    BASIC_BLOCK (bb->index) = bb;
    update_bb_for_insn (bb);
--- 302,308 ----
    BB_HEAD (bb) = head;
    BB_END (bb) = end;
    bb->index = last_basic_block++;
!   bb->flags = BB_NEW | BB_RTL;
    link_block (bb, after);
    BASIC_BLOCK (bb->index) = bb;
    update_bb_for_insn (bb);
*************** rtl_split_block (basic_block bb, void *i
*** 478,498 ****
    FOR_EACH_EDGE (e, ei, new_bb->succs)
      e->src = new_bb;
  
!   if (bb->global_live_at_start)
      {
!       new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
  
        /* We now have to calculate which registers are live at the end
  	 of the split basic block and at the start of the new basic
  	 block.  Start with those registers that are known to be live
  	 at the end of the original basic block and get
  	 propagate_block to determine which registers are live.  */
!       COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
!       propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
!       COPY_REG_SET (bb->global_live_at_end,
! 		    new_bb->global_live_at_start);
  #ifdef HAVE_conditional_execution
        /* In the presence of conditional execution we are not able to update
  	 liveness precisely.  */
--- 480,500 ----
    FOR_EACH_EDGE (e, ei, new_bb->succs)
      e->src = new_bb;
  
!   if (bb->il.rtl->global_live_at_start)
      {
!       new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_end, bb->il.rtl->global_live_at_end);
  
        /* We now have to calculate which registers are live at the end
  	 of the split basic block and at the start of the new basic
  	 block.  Start with those registers that are known to be live
  	 at the end of the original basic block and get
  	 propagate_block to determine which registers are live.  */
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_start, bb->il.rtl->global_live_at_end);
!       propagate_block (new_bb, new_bb->il.rtl->global_live_at_start, NULL, NULL, 0);
!       COPY_REG_SET (bb->il.rtl->global_live_at_end,
! 		    new_bb->il.rtl->global_live_at_start);
  #ifdef HAVE_conditional_execution
        /* In the presence of conditional execution we are not able to update
  	 liveness precisely.  */
*************** rtl_merge_blocks (basic_block a, basic_b
*** 593,598 ****
--- 595,601 ----
      }
  
    BB_END (a) = a_end;
+   a->il.rtl->global_live_at_end = b->il.rtl->global_live_at_end;
  }
  
  /* Return true when block A and B can be merged.  */
*************** force_nonfallthru_and_redirect (edge e, 
*** 1083,1096 ****
        jump_block->frequency = EDGE_FREQUENCY (e);
        jump_block->loop_depth = target->loop_depth;
  
!       if (target->global_live_at_start)
  	{
! 	  jump_block->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
! 	  jump_block->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
! 	  COPY_REG_SET (jump_block->global_live_at_start,
! 			target->global_live_at_start);
! 	  COPY_REG_SET (jump_block->global_live_at_end,
! 			target->global_live_at_start);
  	}
  
        /* Make sure new block ends up in correct hot/cold section.  */
--- 1086,1099 ----
        jump_block->frequency = EDGE_FREQUENCY (e);
        jump_block->loop_depth = target->loop_depth;
  
!       if (target->il.rtl->global_live_at_start)
  	{
! 	  jump_block->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
! 	  jump_block->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
! 	  COPY_REG_SET (jump_block->il.rtl->global_live_at_start,
! 			target->il.rtl->global_live_at_start);
! 	  COPY_REG_SET (jump_block->il.rtl->global_live_at_end,
! 			target->il.rtl->global_live_at_start);
  	}
  
        /* Make sure new block ends up in correct hot/cold section.  */
*************** rtl_split_edge (edge edge_in)
*** 1351,1364 ****
      }
  
    /* ??? This info is likely going to be out of date very soon.  */
!   if (edge_in->dest->global_live_at_start)
      {
!       bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (bb->global_live_at_start,
! 		    edge_in->dest->global_live_at_start);
!       COPY_REG_SET (bb->global_live_at_end,
! 		    edge_in->dest->global_live_at_start);
      }
  
    make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
--- 1354,1367 ----
      }
  
    /* ??? This info is likely going to be out of date very soon.  */
!   if (edge_in->dest->il.rtl->global_live_at_start)
      {
!       bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (bb->il.rtl->global_live_at_start,
! 		    edge_in->dest->il.rtl->global_live_at_start);
!       COPY_REG_SET (bb->il.rtl->global_live_at_end,
! 		    edge_in->dest->il.rtl->global_live_at_start);
      }
  
    make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
*************** safe_insert_insn_on_edge (rtx insn, edge
*** 1457,1463 ****
  	&& !REGNO_PTR_FRAME_P (regno))
        SET_REGNO_REG_SET (killed, regno);
  
!   bitmap_and_into (killed, e->dest->global_live_at_start);
  
    EXECUTE_IF_SET_IN_REG_SET (killed, 0, regno, rsi)
      {
--- 1460,1466 ----
  	&& !REGNO_PTR_FRAME_P (regno))
        SET_REGNO_REG_SET (killed, regno);
  
!   bitmap_and_into (killed, e->dest->il.rtl->global_live_at_start);
  
    EXECUTE_IF_SET_IN_REG_SET (killed, 0, regno, rsi)
      {
*************** rtl_dump_bb (basic_block bb, FILE *outf,
*** 1760,1766 ****
    s_indent[indent] = '\0';
  
    fprintf (outf, ";;%s Registers live at start: ", s_indent);
!   dump_regset (bb->global_live_at_start, outf);
    putc ('\n', outf);
  
    for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
--- 1763,1769 ----
    s_indent[indent] = '\0';
  
    fprintf (outf, ";;%s Registers live at start: ", s_indent);
!   dump_regset (bb->il.rtl->global_live_at_start, outf);
    putc ('\n', outf);
  
    for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
*************** rtl_dump_bb (basic_block bb, FILE *outf,
*** 1768,1774 ****
      print_rtl_single (outf, insn);
  
    fprintf (outf, ";;%s Registers live at end: ", s_indent);
!   dump_regset (bb->global_live_at_end, outf);
    putc ('\n', outf);
  }
  
--- 1771,1777 ----
      print_rtl_single (outf, insn);
  
    fprintf (outf, ";;%s Registers live at end: ", s_indent);
!   dump_regset (bb->il.rtl->global_live_at_end, outf);
    putc ('\n', outf);
  }
  
*************** print_rtl_with_bb (FILE *outf, rtx rtx_f
*** 1819,1825 ****
  	    {
  	      fprintf (outf, ";; Start of basic block %d, registers live:",
  		       bb->index);
! 	      dump_regset (bb->global_live_at_start, outf);
  	      putc ('\n', outf);
  	    }
  
--- 1822,1828 ----
  	    {
  	      fprintf (outf, ";; Start of basic block %d, registers live:",
  		       bb->index);
! 	      dump_regset (bb->il.rtl->global_live_at_start, outf);
  	      putc ('\n', outf);
  	    }
  
*************** print_rtl_with_bb (FILE *outf, rtx rtx_f
*** 1836,1842 ****
  	    {
  	      fprintf (outf, ";; End of basic block %d, registers live:\n",
  		       bb->index);
! 	      dump_regset (bb->global_live_at_end, outf);
  	      putc ('\n', outf);
  	    }
  
--- 1839,1845 ----
  	    {
  	      fprintf (outf, ";; End of basic block %d, registers live:\n",
  		       bb->index);
! 	      dump_regset (bb->il.rtl->global_live_at_end, outf);
  	      putc ('\n', outf);
  	    }
  
*************** rtl_verify_flow_info_1 (void)
*** 1908,1913 ****
--- 1911,1922 ----
  	if (x == end)
  	  break;
  
+       if (!(bb->flags & BB_RTL))
+ 	{
+ 	  error ("BB_RTL flag not set for block %d", bb->index);
+ 	  err = 1;
+ 	}
+ 
        if (!x)
  	{
  	  error ("end insn %d for block %d not found in the insn stream",
*************** cfg_layout_merge_blocks (basic_block a, 
*** 2775,2780 ****
--- 2784,2790 ----
  	}
        b->rbi->footer = NULL;
      }
+   a->il.rtl->global_live_at_end = b->il.rtl->global_live_at_end;
  
    if (dump_file)
      fprintf (dump_file, "Merged blocks %d and %d.\n",
*************** cfg_layout_split_edge (edge e)
*** 2793,2806 ****
  
    /* ??? This info is likely going to be out of date very soon, but we must
       create it to avoid getting an ICE later.  */
!   if (e->dest->global_live_at_start)
      {
!       new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->global_live_at_start,
! 		    e->dest->global_live_at_start);
!       COPY_REG_SET (new_bb->global_live_at_end,
! 		    e->dest->global_live_at_start);
      }
  
    make_edge (new_bb, e->dest, EDGE_FALLTHRU);
--- 2803,2816 ----
  
    /* ??? This info is likely going to be out of date very soon, but we must
       create it to avoid getting an ICE later.  */
!   if (e->dest->il.rtl->global_live_at_start)
      {
!       new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_start,
! 		    e->dest->il.rtl->global_live_at_start);
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_end,
! 		    e->dest->il.rtl->global_live_at_start);
      }
  
    make_edge (new_bb, e->dest, EDGE_FALLTHRU);
*************** rtl_extract_cond_bb_edges (basic_block b
*** 3047,3052 ****
--- 3057,3069 ----
      }
  }
  
+ void
+ init_rtl_bb_info (basic_block bb)
+ {
+   gcc_assert (!bb->il.rtl);
+   bb->il.rtl = ggc_alloc_cleared (sizeof (struct rtl_bb_info));
+ }
+ 
  
  /* Implementation of CFG manipulation for linearized RTL.  */
  struct cfg_hooks rtl_cfg_hooks = {
Index: cfghooks.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfghooks.c,v
retrieving revision 1.27
diff -c -3 -p -r1.27 cfghooks.c
*** cfghooks.c	26 May 2005 18:14:38 -0000	1.27
--- cfghooks.c	10 Jun 2005 12:09:54 -0000
*************** merge_blocks (basic_block a, basic_block
*** 545,551 ****
  
    /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
    b->preds = b->succs = NULL;
-   a->global_live_at_end = b->global_live_at_end;
  
    if (dom_computed[CDI_DOMINATORS])
      redirect_immediate_dominators (CDI_DOMINATORS, b, a);
--- 545,550 ----
Index: cfg.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfg.c,v
retrieving revision 1.93
diff -c -3 -p -r1.93 cfg.c
*** cfg.c	3 Jun 2005 19:03:25 -0000	1.93
--- cfg.c	10 Jun 2005 12:09:53 -0000
*************** clear_bb_flags (void)
*** 419,425 ****
    basic_block bb;
  
    FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
!     bb->flags = BB_PARTITION (bb)  | (bb->flags & BB_DISABLE_SCHEDULE);
  }
  
  /* Check the consistency of profile information.  We can't do that
--- 419,426 ----
    basic_block bb;
  
    FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
!     bb->flags = (BB_PARTITION (bb)  | (bb->flags & BB_DISABLE_SCHEDULE)
! 		 | (bb->flags & BB_RTL));
  }
  
  /* Check the consistency of profile information.  We can't do that
*************** dump_flow_info (FILE *file)
*** 551,566 ****
        FOR_EACH_EDGE (e, ei, bb->succs)
  	dump_edge_info (file, e, 1);
  
!       if (bb->global_live_at_start)
  	{
! 	  fprintf (file, "\nRegisters live at start:");
! 	  dump_regset (bb->global_live_at_start, file);
! 	}
! 
!       if (bb->global_live_at_end)
! 	{
! 	  fprintf (file, "\nRegisters live at end:");
! 	  dump_regset (bb->global_live_at_end, file);
  	}
  
        putc ('\n', file);
--- 552,570 ----
        FOR_EACH_EDGE (e, ei, bb->succs)
  	dump_edge_info (file, e, 1);
  
!       if (bb->flags & BB_RTL)
  	{
! 	  if (bb->il.rtl->global_live_at_start)
! 	    {
! 	      fprintf (file, "\nRegisters live at start:");
! 	      dump_regset (bb->il.rtl->global_live_at_start, file);
! 	    }
! 
! 	  if (bb->il.rtl->global_live_at_end)
! 	    {
! 	      fprintf (file, "\nRegisters live at end:");
! 	      dump_regset (bb->il.rtl->global_live_at_end, file);
! 	    }
  	}
  
        putc ('\n', file);
Index: bb-reorder.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/bb-reorder.c,v
retrieving revision 1.104
diff -c -3 -p -r1.104 bb-reorder.c
*** bb-reorder.c	1 Jun 2005 02:50:51 -0000	1.104
--- bb-reorder.c	10 Jun 2005 12:09:53 -0000
*************** fix_crossing_conditional_branches (void)
*** 1603,1614 ****
  		  
  		  /* Update register liveness information.  */
  		  
! 		  new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
! 		  new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
! 		  COPY_REG_SET (new_bb->global_live_at_end,
! 				prev_bb->global_live_at_end);
! 		  COPY_REG_SET (new_bb->global_live_at_start,
! 				prev_bb->global_live_at_end);
  		  
  		  /* Put appropriate instructions in new bb.  */
  		  
--- 1603,1614 ----
  		  
  		  /* Update register liveness information.  */
  		  
! 		  new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
! 		  new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
! 		  COPY_REG_SET (new_bb->il.rtl->global_live_at_end,
! 				prev_bb->il.rtl->global_live_at_end);
! 		  COPY_REG_SET (new_bb->il.rtl->global_live_at_start,
! 				prev_bb->il.rtl->global_live_at_end);
  		  
  		  /* Put appropriate instructions in new bb.  */
  		  
Index: bt-load.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/bt-load.c,v
retrieving revision 2.35
diff -c -3 -p -r2.35 bt-load.c
*** bt-load.c	7 Jun 2005 14:30:15 -0000	2.35
--- bt-load.c	10 Jun 2005 12:09:53 -0000
*************** compute_defs_uses_and_gen (fibheap_t all
*** 476,482 ****
        CLEAR_HARD_REG_SET (info.btrs_written_in_block);
        for (reg = first_btr; reg <= last_btr; reg++)
  	if (TEST_HARD_REG_BIT (all_btrs, reg)
! 	    && REGNO_REG_SET_P (bb->global_live_at_start, reg))
  	  SET_HARD_REG_BIT (info.btrs_live_in_block, reg);
  
        for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb));
--- 476,482 ----
        CLEAR_HARD_REG_SET (info.btrs_written_in_block);
        for (reg = first_btr; reg <= last_btr; reg++)
  	if (TEST_HARD_REG_BIT (all_btrs, reg)
! 	    && REGNO_REG_SET_P (bb->il.rtl->global_live_at_start, reg))
  	  SET_HARD_REG_BIT (info.btrs_live_in_block, reg);
  
        for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb));
*************** compute_defs_uses_and_gen (fibheap_t all
*** 577,583 ****
        COPY_HARD_REG_SET (btrs_live[i], info.btrs_live_in_block);
        COPY_HARD_REG_SET (btrs_written[i], info.btrs_written_in_block);
  
!       REG_SET_TO_HARD_REG_SET (btrs_live_at_end[i], bb->global_live_at_end);
        /* If this block ends in a jump insn, add any uses or even clobbers
  	 of branch target registers that it might have.  */
        for (insn = BB_END (bb); insn != BB_HEAD (bb) && ! INSN_P (insn); )
--- 577,583 ----
        COPY_HARD_REG_SET (btrs_live[i], info.btrs_live_in_block);
        COPY_HARD_REG_SET (btrs_written[i], info.btrs_written_in_block);
  
!       REG_SET_TO_HARD_REG_SET (btrs_live_at_end[i], bb->il.rtl->global_live_at_end);
        /* If this block ends in a jump insn, add any uses or even clobbers
  	 of branch target registers that it might have.  */
        for (insn = BB_END (bb); insn != BB_HEAD (bb) && ! INSN_P (insn); )
Index: cfgcleanup.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgcleanup.c,v
retrieving revision 1.146
diff -c -3 -p -r1.146 cfgcleanup.c
*** cfgcleanup.c	4 Jun 2005 17:07:55 -0000	1.146
--- cfgcleanup.c	10 Jun 2005 12:09:53 -0000
*************** thread_jump (int mode, edge e, basic_blo
*** 395,401 ****
    /* In case liveness information is available, we need to prove equivalence
       only of the live values.  */
    if (mode & CLEANUP_UPDATE_LIFE)
!     AND_REG_SET (nonequal, b->global_live_at_end);
  
    EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
      goto failed_exit;
--- 395,401 ----
    /* In case liveness information is available, we need to prove equivalence
       only of the live values.  */
    if (mode & CLEANUP_UPDATE_LIFE)
!     AND_REG_SET (nonequal, b->il.rtl->global_live_at_end);
  
    EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)
      goto failed_exit;
Index: cfglayout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfglayout.c,v
retrieving revision 1.87
diff -c -3 -p -r1.87 cfglayout.c
*** cfglayout.c	3 May 2005 16:35:17 -0000	1.87
--- cfglayout.c	10 Jun 2005 12:09:54 -0000
*************** cfg_layout_duplicate_bb (basic_block bb)
*** 1074,1085 ****
  	new_bb->rbi->footer = unlink_insn_chain (insn, get_last_insn ());
      }
  
!   if (bb->global_live_at_start)
      {
!       new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_start);
!       COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
      }
  
    return new_bb;
--- 1074,1087 ----
  	new_bb->rbi->footer = unlink_insn_chain (insn, get_last_insn ());
      }
  
!   if (bb->il.rtl->global_live_at_start)
      {
!       new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_start,
! 		    bb->il.rtl->global_live_at_start);
!       COPY_REG_SET (new_bb->il.rtl->global_live_at_end,
! 		    bb->il.rtl->global_live_at_end);
      }
  
    return new_bb;
Index: combine.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/combine.c,v
retrieving revision 1.491
diff -c -3 -p -r1.491 combine.c
*** combine.c	7 Jun 2005 14:30:15 -0000	1.491
--- combine.c	10 Jun 2005 12:09:55 -0000
*************** set_nonzero_bits_and_sign_copies (rtx x,
*** 985,991 ****
        && REGNO (x) >= FIRST_PSEUDO_REGISTER
        /* If this register is undefined at the start of the file, we can't
  	 say what its contents were.  */
!       && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, REGNO (x))
        && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
      {
        if (set == 0 || GET_CODE (set) == CLOBBER)
--- 985,992 ----
        && REGNO (x) >= FIRST_PSEUDO_REGISTER
        /* If this register is undefined at the start of the file, we can't
  	 say what its contents were.  */
!       && ! REGNO_REG_SET_P
!          (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start, REGNO (x))
        && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
      {
        if (set == 0 || GET_CODE (set) == CLOBBER)
*************** reg_nonzero_bits_for_combine (rtx x, enu
*** 8278,8285 ****
        && (reg_stat[REGNO (x)].last_set_label == label_tick
  	  || (REGNO (x) >= FIRST_PSEUDO_REGISTER
  	      && REG_N_SETS (REGNO (x)) == 1
! 	      && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
! 				    REGNO (x))))
        && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
      {
        *nonzero &= reg_stat[REGNO (x)].last_set_nonzero_bits;
--- 8279,8287 ----
        && (reg_stat[REGNO (x)].last_set_label == label_tick
  	  || (REGNO (x) >= FIRST_PSEUDO_REGISTER
  	      && REG_N_SETS (REGNO (x)) == 1
! 	      && ! REGNO_REG_SET_P
! 	         (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
! 		  REGNO (x))))
        && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
      {
        *nonzero &= reg_stat[REGNO (x)].last_set_nonzero_bits;
*************** reg_num_sign_bit_copies_for_combine (rtx
*** 8345,8352 ****
        && (reg_stat[REGNO (x)].last_set_label == label_tick
            || (REGNO (x) >= FIRST_PSEUDO_REGISTER
  	      && REG_N_SETS (REGNO (x)) == 1
! 	      && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
! 				    REGNO (x))))
        && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
      {
        *result = reg_stat[REGNO (x)].last_set_sign_bit_copies;
--- 8347,8355 ----
        && (reg_stat[REGNO (x)].last_set_label == label_tick
            || (REGNO (x) >= FIRST_PSEUDO_REGISTER
  	      && REG_N_SETS (REGNO (x)) == 1
! 	      && ! REGNO_REG_SET_P
! 	         (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
! 		  REGNO (x))))
        && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
      {
        *result = reg_stat[REGNO (x)].last_set_sign_bit_copies;
*************** get_last_value_validate (rtx *loc, rtx i
*** 11180,11186 ****
  	    || (! (regno >= FIRST_PSEUDO_REGISTER
  		   && REG_N_SETS (regno) == 1
  		   && (! REGNO_REG_SET_P
! 		       (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))
  		&& reg_stat[j].last_set_label > tick))
  	  {
  	    if (replace)
--- 11183,11190 ----
  	    || (! (regno >= FIRST_PSEUDO_REGISTER
  		   && REG_N_SETS (regno) == 1
  		   && (! REGNO_REG_SET_P
! 		       (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
! 			regno)))
  		&& reg_stat[j].last_set_label > tick))
  	  {
  	    if (replace)
*************** get_last_value (rtx x)
*** 11290,11296 ****
  	  && (regno < FIRST_PSEUDO_REGISTER
  	      || REG_N_SETS (regno) != 1
  	      || (REGNO_REG_SET_P
! 		  (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))))
      return 0;
  
    /* If the value was set in a later insn than the ones we are processing,
--- 11294,11301 ----
  	  && (regno < FIRST_PSEUDO_REGISTER
  	      || REG_N_SETS (regno) != 1
  	      || (REGNO_REG_SET_P
! 		  (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
! 		   regno)))))
      return 0;
  
    /* If the value was set in a later insn than the ones we are processing,
*************** reg_dead_at_p (rtx reg, rtx insn)
*** 11451,11457 ****
      }
  
    for (i = reg_dead_regno; i < reg_dead_endregno; i++)
!     if (REGNO_REG_SET_P (block->global_live_at_start, i))
        return 0;
  
    return 1;
--- 11456,11462 ----
      }
  
    for (i = reg_dead_regno; i < reg_dead_endregno; i++)
!     if (REGNO_REG_SET_P (block->il.rtl->global_live_at_start, i))
        return 0;
  
    return 1;
*************** distribute_notes (rtx notes, rtx from_in
*** 12218,12224 ****
  		 was dead, there's nothing left to do.  Otherwise, we'll
  		 need to do a global life update after combine.  */
  	      if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
! 		  && REGNO_REG_SET_P (bb->global_live_at_start,
  				      REGNO (XEXP (note, 0))))
  		SET_BIT (refresh_blocks, this_basic_block->index);
  	    }
--- 12223,12229 ----
  		 was dead, there's nothing left to do.  Otherwise, we'll
  		 need to do a global life update after combine.  */
  	      if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
! 		  && REGNO_REG_SET_P (bb->il.rtl->global_live_at_start,
  				      REGNO (XEXP (note, 0))))
  		SET_BIT (refresh_blocks, this_basic_block->index);
  	    }
Index: flow.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/flow.c,v
retrieving revision 1.629
diff -c -3 -p -r1.629 flow.c
*** flow.c	7 Jun 2005 14:30:17 -0000	1.629
--- flow.c	10 Jun 2005 12:09:55 -0000
*************** life_analysis (FILE *file, int flags)
*** 416,422 ****
    allocate_bb_life_data ();
  
    /* Find the set of registers live on function exit.  */
!   mark_regs_live_at_end (EXIT_BLOCK_PTR->global_live_at_start);
  
    /* "Update" life info from zero.  It'd be nice to begin the
       relaxation with just the exit and noreturn blocks, but that set
--- 416,422 ----
    allocate_bb_life_data ();
  
    /* Find the set of registers live on function exit.  */
!   mark_regs_live_at_end (EXIT_BLOCK_PTR->il.rtl->global_live_at_start);
  
    /* "Update" life info from zero.  It'd be nice to begin the
       relaxation with just the exit and noreturn blocks, but that set
*************** verify_local_live_at_start (regset new_l
*** 504,510 ****
      {
        /* After reload, there are no pseudos, nor subregs of multi-word
  	 registers.  The regsets should exactly match.  */
!       if (! REG_SET_EQUAL_P (new_live_at_start, bb->global_live_at_start))
  	{
  	  if (dump_file)
  	    {
--- 504,511 ----
      {
        /* After reload, there are no pseudos, nor subregs of multi-word
  	 registers.  The regsets should exactly match.  */
!       if (! REG_SET_EQUAL_P (new_live_at_start,
! 	    		     bb->il.rtl->global_live_at_start))
  	{
  	  if (dump_file)
  	    {
*************** verify_local_live_at_start (regset new_l
*** 524,535 ****
        reg_set_iterator rsi;
  
        /* Find the set of changed registers.  */
!       XOR_REG_SET (new_live_at_start, bb->global_live_at_start);
  
        EXECUTE_IF_SET_IN_REG_SET (new_live_at_start, 0, i, rsi)
  	{
  	  /* No registers should die.  */
! 	  if (REGNO_REG_SET_P (bb->global_live_at_start, i))
  	    {
  	      if (dump_file)
  		{
--- 525,536 ----
        reg_set_iterator rsi;
  
        /* Find the set of changed registers.  */
!       XOR_REG_SET (new_live_at_start, bb->il.rtl->global_live_at_start);
  
        EXECUTE_IF_SET_IN_REG_SET (new_live_at_start, 0, i, rsi)
  	{
  	  /* No registers should die.  */
! 	  if (REGNO_REG_SET_P (bb->il.rtl->global_live_at_start, i))
  	    {
  	      if (dump_file)
  		{
*************** update_life_info (sbitmap blocks, enum u
*** 608,614 ****
  	     in turn may allow for further dead code detection / removal.  */
  	  FOR_EACH_BB_REVERSE (bb)
  	    {
! 	      COPY_REG_SET (tmp, bb->global_live_at_end);
  	      changed |= propagate_block (bb, tmp, NULL, NULL,
  				prop_flags & (PROP_SCAN_DEAD_CODE
  					      | PROP_SCAN_DEAD_STORES
--- 609,615 ----
  	     in turn may allow for further dead code detection / removal.  */
  	  FOR_EACH_BB_REVERSE (bb)
  	    {
! 	      COPY_REG_SET (tmp, bb->il.rtl->global_live_at_end);
  	      changed |= propagate_block (bb, tmp, NULL, NULL,
  				prop_flags & (PROP_SCAN_DEAD_CODE
  					      | PROP_SCAN_DEAD_STORES
*************** update_life_info (sbitmap blocks, enum u
*** 637,644 ****
  	     in the code being marked live at entry.  */
  	  FOR_EACH_BB (bb)
  	    {
! 	      CLEAR_REG_SET (bb->global_live_at_start);
! 	      CLEAR_REG_SET (bb->global_live_at_end);
  	    }
  	}
  
--- 638,645 ----
  	     in the code being marked live at entry.  */
  	  FOR_EACH_BB (bb)
  	    {
! 	      CLEAR_REG_SET (bb->il.rtl->global_live_at_start);
! 	      CLEAR_REG_SET (bb->il.rtl->global_live_at_end);
  	    }
  	}
  
*************** update_life_info (sbitmap blocks, enum u
*** 659,665 ****
  	{
  	  bb = BASIC_BLOCK (i);
  
! 	  COPY_REG_SET (tmp, bb->global_live_at_end);
  	  propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
  
  	  if (extent == UPDATE_LIFE_LOCAL)
--- 660,666 ----
  	{
  	  bb = BASIC_BLOCK (i);
  
! 	  COPY_REG_SET (tmp, bb->il.rtl->global_live_at_end);
  	  propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
  
  	  if (extent == UPDATE_LIFE_LOCAL)
*************** update_life_info (sbitmap blocks, enum u
*** 670,676 ****
      {
        FOR_EACH_BB_REVERSE (bb)
  	{
! 	  COPY_REG_SET (tmp, bb->global_live_at_end);
  
  	  propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
  
--- 671,677 ----
      {
        FOR_EACH_BB_REVERSE (bb)
  	{
! 	  COPY_REG_SET (tmp, bb->il.rtl->global_live_at_end);
  
  	  propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
  
*************** update_life_info (sbitmap blocks, enum u
*** 689,695 ****
  	 are those that were not set anywhere in the function.  local-alloc
  	 doesn't know how to handle these correctly, so mark them as not
  	 local to any one basic block.  */
!       EXECUTE_IF_SET_IN_REG_SET (ENTRY_BLOCK_PTR->global_live_at_end,
  				 FIRST_PSEUDO_REGISTER, i, rsi)
  	REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL;
  
--- 690,696 ----
  	 are those that were not set anywhere in the function.  local-alloc
  	 doesn't know how to handle these correctly, so mark them as not
  	 local to any one basic block.  */
!       EXECUTE_IF_SET_IN_REG_SET (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end,
  				 FIRST_PSEUDO_REGISTER, i, rsi)
  	REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL;
  
*************** free_basic_block_vars (void)
*** 767,775 ****
    label_to_block_map = NULL;
  
    ENTRY_BLOCK_PTR->aux = NULL;
!   ENTRY_BLOCK_PTR->global_live_at_end = NULL;
    EXIT_BLOCK_PTR->aux = NULL;
!   EXIT_BLOCK_PTR->global_live_at_start = NULL;
  }
  
  /* Delete any insns that copy a register to itself.  */
--- 768,776 ----
    label_to_block_map = NULL;
  
    ENTRY_BLOCK_PTR->aux = NULL;
!   ENTRY_BLOCK_PTR->il.rtl->global_live_at_end = NULL;
    EXIT_BLOCK_PTR->aux = NULL;
!   EXIT_BLOCK_PTR->il.rtl->global_live_at_start = NULL;
  }
  
  /* Delete any insns that copy a register to itself.  */
*************** calculate_global_regs_live (sbitmap bloc
*** 1186,1195 ****
  	       confused by sibling call edges, which crashes reg-stack.  */
  	    if (e->flags & EDGE_EH)
  	      bitmap_ior_and_compl_into (new_live_at_end,
! 					 sb->global_live_at_start,
  					 invalidated_by_call);
  	    else
! 	      IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
  
  	    /* If a target saves one register in another (instead of on
  	       the stack) the save register will need to be live for EH.  */
--- 1187,1196 ----
  	       confused by sibling call edges, which crashes reg-stack.  */
  	    if (e->flags & EDGE_EH)
  	      bitmap_ior_and_compl_into (new_live_at_end,
! 					 sb->il.rtl->global_live_at_start,
  					 invalidated_by_call);
  	    else
! 	      IOR_REG_SET (new_live_at_end, sb->il.rtl->global_live_at_start);
  
  	    /* If a target saves one register in another (instead of on
  	       the stack) the save register will need to be live for EH.  */
*************** calculate_global_regs_live (sbitmap bloc
*** 1236,1242 ****
  
        if (bb == ENTRY_BLOCK_PTR)
  	{
! 	  COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
  	  continue;
  	}
  
--- 1237,1243 ----
  
        if (bb == ENTRY_BLOCK_PTR)
  	{
! 	  COPY_REG_SET (bb->il.rtl->global_live_at_end, new_live_at_end);
  	  continue;
  	}
  
*************** calculate_global_regs_live (sbitmap bloc
*** 1259,1265 ****
  	     rescan the block.  This wouldn't be necessary if we had
  	     precalculated local_live, however with PROP_SCAN_DEAD_CODE
  	     local_live is really dependent on live_at_end.  */
! 	  rescan = bitmap_intersect_compl_p (bb->global_live_at_end,
  					     new_live_at_end);
  
  	  if (!rescan)
--- 1260,1266 ----
  	     rescan the block.  This wouldn't be necessary if we had
  	     precalculated local_live, however with PROP_SCAN_DEAD_CODE
  	     local_live is really dependent on live_at_end.  */
! 	  rescan = bitmap_intersect_compl_p (bb->il.rtl->global_live_at_end,
  					     new_live_at_end);
  
  	  if (!rescan)
*************** calculate_global_regs_live (sbitmap bloc
*** 1284,1290 ****
  
  	      /* Find the set of changed bits.  Take this opportunity
  		 to notice that this set is empty and early out.  */
! 	      bitmap_xor (tmp, bb->global_live_at_end, new_live_at_end);
  	      if (bitmap_empty_p (tmp))
  		continue;
    
--- 1285,1291 ----
  
  	      /* Find the set of changed bits.  Take this opportunity
  		 to notice that this set is empty and early out.  */
! 	      bitmap_xor (tmp, bb->il.rtl->global_live_at_end, new_live_at_end);
  	      if (bitmap_empty_p (tmp))
  		continue;
    
*************** calculate_global_regs_live (sbitmap bloc
*** 1305,1320 ****
  	  /* Add to live_at_start the set of all registers in
  	     new_live_at_end that aren't in the old live_at_end.  */
  	  
! 	  changed = bitmap_ior_and_compl_into (bb->global_live_at_start,
  					       new_live_at_end,
! 					       bb->global_live_at_end);
! 	  COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
  	  if (! changed)
  	    continue;
  	}
        else
  	{
! 	  COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
  
  	  /* Rescan the block insn by insn to turn (a copy of) live_at_end
  	     into live_at_start.  */
--- 1306,1321 ----
  	  /* Add to live_at_start the set of all registers in
  	     new_live_at_end that aren't in the old live_at_end.  */
  	  
! 	  changed = bitmap_ior_and_compl_into (bb->il.rtl->global_live_at_start,
  					       new_live_at_end,
! 					       bb->il.rtl->global_live_at_end);
! 	  COPY_REG_SET (bb->il.rtl->global_live_at_end, new_live_at_end);
  	  if (! changed)
  	    continue;
  	}
        else
  	{
! 	  COPY_REG_SET (bb->il.rtl->global_live_at_end, new_live_at_end);
  
  	  /* Rescan the block insn by insn to turn (a copy of) live_at_end
  	     into live_at_start.  */
*************** calculate_global_regs_live (sbitmap bloc
*** 1324,1337 ****
  			   flags);
  
  	  /* If live_at start didn't change, no need to go farther.  */
! 	  if (REG_SET_EQUAL_P (bb->global_live_at_start, new_live_at_end))
  	    continue;
  
  	  if (failure_strategy_required)
  	    {
  	      /* Get the list of registers that were removed from the
  	         bb->global_live_at_start set.  */
! 	      bitmap_and_compl (tmp, bb->global_live_at_start,
  				new_live_at_end);
  	      if (!bitmap_empty_p (tmp))
  		{
--- 1325,1339 ----
  			   flags);
  
  	  /* If live_at start didn't change, no need to go farther.  */
! 	  if (REG_SET_EQUAL_P (bb->il.rtl->global_live_at_start,
! 			       new_live_at_end))
  	    continue;
  
  	  if (failure_strategy_required)
  	    {
  	      /* Get the list of registers that were removed from the
  	         bb->global_live_at_start set.  */
! 	      bitmap_and_compl (tmp, bb->il.rtl->global_live_at_start,
  				new_live_at_end);
  	      if (!bitmap_empty_p (tmp))
  		{
*************** calculate_global_regs_live (sbitmap bloc
*** 1350,1360 ****
  		      pbb_changed = false;
  
  		      pbb_changed
! 			|= bitmap_and_compl_into (pbb->global_live_at_start,
! 						  registers_made_dead);
  		      pbb_changed
! 			|= bitmap_and_compl_into (pbb->global_live_at_end,
! 						  registers_made_dead);
  		      if (!pbb_changed)
  			continue;
  
--- 1352,1364 ----
  		      pbb_changed = false;
  
  		      pbb_changed
! 			|= bitmap_and_compl_into
! 			    (pbb->il.rtl->global_live_at_start,
! 			     registers_made_dead);
  		      pbb_changed
! 			|= bitmap_and_compl_into
! 			    (pbb->il.rtl->global_live_at_end,
! 			     registers_made_dead);
  		      if (!pbb_changed)
  			continue;
  
*************** calculate_global_regs_live (sbitmap bloc
*** 1383,1389 ****
  		}
  	    } /* end of failure_strategy_required */
  
! 	  COPY_REG_SET (bb->global_live_at_start, new_live_at_end);
  	}
  
        /* Queue all predecessors of BB so that we may re-examine
--- 1387,1393 ----
  		}
  	    } /* end of failure_strategy_required */
  
! 	  COPY_REG_SET (bb->il.rtl->global_live_at_start, new_live_at_end);
  	}
  
        /* Queue all predecessors of BB so that we may re-examine
*************** initialize_uninitialized_subregs (void)
*** 1504,1510 ****
    FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
      {
        basic_block bb = e->dest;
!       regset map = bb->global_live_at_start;
        reg_set_iterator rsi;
  
        EXECUTE_IF_SET_IN_REG_SET (map, FIRST_PSEUDO_REGISTER, reg, rsi)
--- 1508,1514 ----
    FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
      {
        basic_block bb = e->dest;
!       regset map = bb->il.rtl->global_live_at_start;
        reg_set_iterator rsi;
  
        EXECUTE_IF_SET_IN_REG_SET (map, FIRST_PSEUDO_REGISTER, reg, rsi)
*************** allocate_bb_life_data (void)
*** 1556,1563 ****
  
    FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
      {
!       bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
      }
  
    regs_live_at_setjmp = ALLOC_REG_SET (&reg_obstack);
--- 1560,1567 ----
  
    FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
      {
!       bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
!       bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
      }
  
    regs_live_at_setjmp = ALLOC_REG_SET (&reg_obstack);
*************** propagate_one_insn (struct propagate_blo
*** 1856,1862 ****
  	     except for return values.  */
  
  	  sibcall_p = SIBLING_CALL_P (insn);
! 	  live_at_end = EXIT_BLOCK_PTR->global_live_at_start;
  	  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
  	    if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
  		&& ! (sibcall_p
--- 1860,1866 ----
  	     except for return values.  */
  
  	  sibcall_p = SIBLING_CALL_P (insn);
! 	  live_at_end = EXIT_BLOCK_PTR->il.rtl->global_live_at_start;
  	  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
  	    if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
  		&& ! (sibcall_p
*************** init_propagate_block_info (basic_block b
*** 1991,1998 ****
  	}
  
        /* Compute which register lead different lives in the successors.  */
!       bitmap_xor (diff, bb_true->global_live_at_start,
! 		  bb_false->global_live_at_start);
        
        if (!bitmap_empty_p (diff))
  	  {
--- 1995,2002 ----
  	}
  
        /* Compute which register lead different lives in the successors.  */
!       bitmap_xor (diff, bb_true->il.rtl->global_live_at_start,
! 		  bb_false->il.rtl->global_live_at_start);
        
        if (!bitmap_empty_p (diff))
  	  {
*************** init_propagate_block_info (basic_block b
*** 2037,2043 ****
  
  		  rcli = xmalloc (sizeof (*rcli));
  
! 		  if (REGNO_REG_SET_P (bb_true->global_live_at_start, i))
  		    cond = cond_false;
  		  else
  		    cond = cond_true;
--- 2041,2048 ----
  
  		  rcli = xmalloc (sizeof (*rcli));
  
! 		  if (REGNO_REG_SET_P (bb_true->il.rtl->global_live_at_start,
! 				       i))
  		    cond = cond_false;
  		  else
  		    cond = cond_true;
*************** regno_clobbered_at_setjmp (int regno)
*** 2468,2474 ****
      return 0;
  
    return ((REG_N_SETS (regno) > 1
! 	   || REGNO_REG_SET_P (ENTRY_BLOCK_PTR->global_live_at_end, regno))
  	  && REGNO_REG_SET_P (regs_live_at_setjmp, regno));
  }
  
--- 2473,2480 ----
      return 0;
  
    return ((REG_N_SETS (regno) > 1
! 	   || REGNO_REG_SET_P (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end,
! 	     		       regno))
  	  && REGNO_REG_SET_P (regs_live_at_setjmp, regno));
  }
  
Index: function.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.c,v
retrieving revision 1.624
diff -c -3 -p -r1.624 function.c
*** function.c	4 Jun 2005 17:22:18 -0000	1.624
--- function.c	10 Jun 2005 12:09:55 -0000
*************** keep_stack_depressed (rtx insns)
*** 4702,4709 ****
  		if (HARD_REGNO_MODE_OK (regno, Pmode)
  		    && !fixed_regs[regno]
  		    && TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
! 		    && !REGNO_REG_SET_P (EXIT_BLOCK_PTR->global_live_at_start,
! 					 regno)
  		    && !refers_to_regno_p (regno,
  					   regno + hard_regno_nregs[regno]
  								   [Pmode],
--- 4702,4709 ----
  		if (HARD_REGNO_MODE_OK (regno, Pmode)
  		    && !fixed_regs[regno]
  		    && TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
! 		    && !REGNO_REG_SET_P
! 		         (EXIT_BLOCK_PTR->il.rtl->global_live_at_start, regno)
  		    && !refers_to_regno_p (regno,
  					   regno + hard_regno_nregs[regno]
  								   [Pmode],
Index: global.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/global.c,v
retrieving revision 1.127
diff -c -3 -p -r1.127 global.c
*** global.c	27 May 2005 13:25:57 -0000	1.127
--- global.c	10 Jun 2005 12:09:56 -0000
*************** global_conflicts (void)
*** 694,700 ****
  	 be explicitly marked in basic_block_live_at_start.  */
  
        {
! 	regset old = b->global_live_at_start;
  	int ax = 0;
  	reg_set_iterator rsi;
  
--- 694,700 ----
  	 be explicitly marked in basic_block_live_at_start.  */
  
        {
! 	regset old = b->il.rtl->global_live_at_start;
  	int ax = 0;
  	reg_set_iterator rsi;
  
*************** mark_elimination (int from, int to)
*** 1726,1732 ****
  
    FOR_EACH_BB (bb)
      {
!       regset r = bb->global_live_at_start;
        if (REGNO_REG_SET_P (r, from))
  	{
  	  CLEAR_REGNO_REG_SET (r, from);
--- 1726,1732 ----
  
    FOR_EACH_BB (bb)
      {
!       regset r = bb->il.rtl->global_live_at_start;
        if (REGNO_REG_SET_P (r, from))
  	{
  	  CLEAR_REGNO_REG_SET (r, from);
*************** build_insn_chain (rtx first)
*** 1816,1822 ****
  
  	  CLEAR_REG_SET (live_relevant_regs);
  
! 	  EXECUTE_IF_SET_IN_BITMAP (b->global_live_at_start, 0, i, bi)
  	    {
  	      if (i < FIRST_PSEUDO_REGISTER
  		  ? ! TEST_HARD_REG_BIT (eliminable_regset, i)
--- 1816,1822 ----
  
  	  CLEAR_REG_SET (live_relevant_regs);
  
! 	  EXECUTE_IF_SET_IN_BITMAP (b->il.rtl->global_live_at_start, 0, i, bi)
  	    {
  	      if (i < FIRST_PSEUDO_REGISTER
  		  ? ! TEST_HARD_REG_BIT (eliminable_regset, i)
*************** calculate_reg_pav (void)
*** 2345,2354 ****
  	      if (pred->index != ENTRY_BLOCK)
  		bitmap_ior_into (bb_live_pavin, BB_INFO (pred)->live_pavout);
  	    }
! 	  bitmap_and_into (bb_live_pavin, bb->global_live_at_start);
  	  bitmap_ior_and_compl (temp_bitmap, bb_info->avloc,
  				bb_live_pavin, bb_info->killed);
! 	  bitmap_and_into (temp_bitmap, bb->global_live_at_end);
  	  if (! bitmap_equal_p (temp_bitmap, bb_live_pavout))
  	    {
  	      bitmap_copy (bb_live_pavout, temp_bitmap);
--- 2345,2354 ----
  	      if (pred->index != ENTRY_BLOCK)
  		bitmap_ior_into (bb_live_pavin, BB_INFO (pred)->live_pavout);
  	    }
! 	  bitmap_and_into (bb_live_pavin, bb->il.rtl->global_live_at_start);
  	  bitmap_ior_and_compl (temp_bitmap, bb_info->avloc,
  				bb_live_pavin, bb_info->killed);
! 	  bitmap_and_into (temp_bitmap, bb->il.rtl->global_live_at_end);
  	  if (! bitmap_equal_p (temp_bitmap, bb_live_pavout))
  	    {
  	      bitmap_copy (bb_live_pavout, temp_bitmap);
*************** make_accurate_live_analysis (void)
*** 2469,2476 ****
      {
        bb_info = BB_INFO (bb);
        
!       bitmap_and_into (bb->global_live_at_start, bb_info->live_pavin);
!       bitmap_and_into (bb->global_live_at_end, bb_info->live_pavout);
      }
    free_bb_info ();
  }
--- 2469,2476 ----
      {
        bb_info = BB_INFO (bb);
        
!       bitmap_and_into (bb->il.rtl->global_live_at_start, bb_info->live_pavin);
!       bitmap_and_into (bb->il.rtl->global_live_at_end, bb_info->live_pavout);
      }
    free_bb_info ();
  }
Index: ifcvt.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ifcvt.c,v
retrieving revision 1.190
diff -c -3 -p -r1.190 ifcvt.c
*** ifcvt.c	1 Jun 2005 11:38:53 -0000	1.190
--- ifcvt.c	10 Jun 2005 12:09:56 -0000
*************** merge_if_block (struct ce_if_block * ce_
*** 2364,2372 ****
  
    if (then_bb)
      {
!       if (combo_bb->global_live_at_end)
! 	COPY_REG_SET (combo_bb->global_live_at_end,
! 		      then_bb->global_live_at_end);
        merge_blocks (combo_bb, then_bb);
        num_true_changes++;
      }
--- 2364,2372 ----
  
    if (then_bb)
      {
!       if (combo_bb->il.rtl->global_live_at_end)
! 	COPY_REG_SET (combo_bb->il.rtl->global_live_at_end,
! 		      then_bb->il.rtl->global_live_at_end);
        merge_blocks (combo_bb, then_bb);
        num_true_changes++;
      }
*************** merge_if_block (struct ce_if_block * ce_
*** 2417,2425 ****
  	   && join_bb != EXIT_BLOCK_PTR)
      {
        /* We can merge the JOIN.  */
!       if (combo_bb->global_live_at_end)
! 	COPY_REG_SET (combo_bb->global_live_at_end,
! 		      join_bb->global_live_at_end);
  
        merge_blocks (combo_bb, join_bb);
        num_true_changes++;
--- 2417,2425 ----
  	   && join_bb != EXIT_BLOCK_PTR)
      {
        /* We can merge the JOIN.  */
!       if (combo_bb->il.rtl->global_live_at_end)
! 	COPY_REG_SET (combo_bb->il.rtl->global_live_at_end,
! 		      join_bb->il.rtl->global_live_at_end);
  
        merge_blocks (combo_bb, join_bb);
        num_true_changes++;
*************** find_if_case_1 (basic_block test_bb, edg
*** 3060,3068 ****
    /* Conversion went ok, including moving the insns and fixing up the
       jump.  Adjust the CFG to match.  */
  
!   bitmap_ior (test_bb->global_live_at_end,
! 	      else_bb->global_live_at_start,
! 	      then_bb->global_live_at_end);
  
  
    /* We can avoid creating a new basic block if then_bb is immediately
--- 3060,3068 ----
    /* Conversion went ok, including moving the insns and fixing up the
       jump.  Adjust the CFG to match.  */
  
!   bitmap_ior (test_bb->il.rtl->global_live_at_end,
! 	      else_bb->il.rtl->global_live_at_start,
! 	      then_bb->il.rtl->global_live_at_end);
  
  
    /* We can avoid creating a new basic block if then_bb is immediately
*************** find_if_case_2 (basic_block test_bb, edg
*** 3178,3186 ****
    /* Conversion went ok, including moving the insns and fixing up the
       jump.  Adjust the CFG to match.  */
  
!   bitmap_ior (test_bb->global_live_at_end,
! 	      then_bb->global_live_at_start,
! 	      else_bb->global_live_at_end);
  
    delete_basic_block (else_bb);
  
--- 3178,3186 ----
    /* Conversion went ok, including moving the insns and fixing up the
       jump.  Adjust the CFG to match.  */
  
!   bitmap_ior (test_bb->il.rtl->global_live_at_end,
! 	      then_bb->il.rtl->global_live_at_start,
! 	      else_bb->il.rtl->global_live_at_end);
  
    delete_basic_block (else_bb);
  
*************** dead_or_predicable (basic_block test_bb,
*** 3357,3363 ****
        /* For TEST, we're interested in a range of insns, not a whole block.
  	 Moreover, we're interested in the insns live from OTHER_BB.  */
  
!       COPY_REG_SET (test_live, other_bb->global_live_at_start);
        pbi = init_propagate_block_info (test_bb, test_live, test_set, test_set,
  				       0);
  
--- 3357,3363 ----
        /* For TEST, we're interested in a range of insns, not a whole block.
  	 Moreover, we're interested in the insns live from OTHER_BB.  */
  
!       COPY_REG_SET (test_live, other_bb->il.rtl->global_live_at_start);
        pbi = init_propagate_block_info (test_bb, test_live, test_set, test_set,
  				       0);
  
*************** dead_or_predicable (basic_block test_bb,
*** 3373,3384 ****
        /* We can perform the transformation if
  	   MERGE_SET & (TEST_SET | TEST_LIVE)
  	 and
! 	   TEST_SET & merge_bb->global_live_at_start
  	 are empty.  */
  
        if (bitmap_intersect_p (test_set, merge_set)
  	  || bitmap_intersect_p (test_live, merge_set)
! 	  || bitmap_intersect_p (test_set, merge_bb->global_live_at_start))
  	fail = 1;
  
        FREE_REG_SET (tmp);
--- 3373,3385 ----
        /* We can perform the transformation if
  	   MERGE_SET & (TEST_SET | TEST_LIVE)
  	 and
! 	   TEST_SET & merge_bb->il.rtl->global_live_at_start
  	 are empty.  */
  
        if (bitmap_intersect_p (test_set, merge_set)
  	  || bitmap_intersect_p (test_live, merge_set)
! 	  || bitmap_intersect_p (test_set,
! 	    			 merge_bb->il.rtl->global_live_at_start))
  	fail = 1;
  
        FREE_REG_SET (tmp);
Index: local-alloc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/local-alloc.c,v
retrieving revision 1.148
diff -c -3 -p -r1.148 local-alloc.c
*** local-alloc.c	2 Jun 2005 08:55:01 -0000	1.148
--- local-alloc.c	10 Jun 2005 12:09:56 -0000
*************** update_equiv_regs (void)
*** 1128,1135 ****
  	{
  	  FOR_EACH_BB (bb)
  	    {
! 	      AND_COMPL_REG_SET (bb->global_live_at_start, &cleared_regs);
! 	      AND_COMPL_REG_SET (bb->global_live_at_end, &cleared_regs);
  	    }
  	}
        else
--- 1128,1137 ----
  	{
  	  FOR_EACH_BB (bb)
  	    {
! 	      AND_COMPL_REG_SET (bb->il.rtl->global_live_at_start,
! 			         &cleared_regs);
! 	      AND_COMPL_REG_SET (bb->il.rtl->global_live_at_end,
! 			         &cleared_regs);
  	    }
  	}
        else
*************** update_equiv_regs (void)
*** 1139,1146 ****
  	    {
  	      FOR_EACH_BB (bb)
  		{
! 		  CLEAR_REGNO_REG_SET (bb->global_live_at_start, j);
! 		  CLEAR_REGNO_REG_SET (bb->global_live_at_end, j);
  		}
  	    }
  	}
--- 1141,1148 ----
  	    {
  	      FOR_EACH_BB (bb)
  		{
! 		  CLEAR_REGNO_REG_SET (bb->il.rtl->global_live_at_start, j);
! 		  CLEAR_REGNO_REG_SET (bb->il.rtl->global_live_at_end, j);
  		}
  	    }
  	}
*************** block_alloc (int b)
*** 1216,1222 ****
  
    /* Initialize table of hardware registers currently live.  */
  
!   REG_SET_TO_HARD_REG_SET (regs_live, BASIC_BLOCK (b)->global_live_at_start);
  
    /* This loop scans the instructions of the basic block
       and assigns quantities to registers.
--- 1218,1225 ----
  
    /* Initialize table of hardware registers currently live.  */
  
!   REG_SET_TO_HARD_REG_SET (regs_live,
! 		  	   BASIC_BLOCK (b)->il.rtl->global_live_at_start);
  
    /* This loop scans the instructions of the basic block
       and assigns quantities to registers.
Index: mode-switching.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/mode-switching.c,v
retrieving revision 2.2
diff -c -3 -p -r2.2 mode-switching.c
*** mode-switching.c	7 Jun 2005 02:12:13 -0000	2.2
--- mode-switching.c	10 Jun 2005 12:09:56 -0000
*************** create_pre_exit (int n_entities, int *en
*** 219,225 ****
      if (eg->flags & EDGE_FALLTHRU)
        {
  	basic_block src_bb = eg->src;
! 	regset live_at_end = src_bb->global_live_at_end;
  	rtx last_insn, ret_reg;
  
  	gcc_assert (!pre_exit);
--- 219,225 ----
      if (eg->flags & EDGE_FALLTHRU)
        {
  	basic_block src_bb = eg->src;
! 	regset live_at_end = src_bb->il.rtl->global_live_at_end;
  	rtx last_insn, ret_reg;
  
  	gcc_assert (!pre_exit);
*************** create_pre_exit (int n_entities, int *en
*** 368,375 ****
  	else
  	  {
  	    pre_exit = split_edge (eg);
! 	    COPY_REG_SET (pre_exit->global_live_at_start, live_at_end);
! 	    COPY_REG_SET (pre_exit->global_live_at_end, live_at_end);
  	  }
        }
  
--- 368,375 ----
  	else
  	  {
  	    pre_exit = split_edge (eg);
! 	    COPY_REG_SET (pre_exit->il.rtl->global_live_at_start, live_at_end);
! 	    COPY_REG_SET (pre_exit->il.rtl->global_live_at_end, live_at_end);
  	  }
        }
  
*************** optimize_mode_switching (FILE *file)
*** 453,459 ****
  	  HARD_REG_SET live_now;
  
  	  REG_SET_TO_HARD_REG_SET (live_now,
! 				   bb->global_live_at_start);
  	  for (insn = BB_HEAD (bb);
  	       insn != NULL && insn != NEXT_INSN (BB_END (bb));
  	       insn = NEXT_INSN (insn))
--- 453,459 ----
  	  HARD_REG_SET live_now;
  
  	  REG_SET_TO_HARD_REG_SET (live_now,
! 				   bb->il.rtl->global_live_at_start);
  	  for (insn = BB_HEAD (bb);
  	       insn != NULL && insn != NEXT_INSN (BB_END (bb));
  	       insn = NEXT_INSN (insn))
*************** optimize_mode_switching (FILE *file)
*** 583,589 ****
  	      src_bb = eg->src;
  
  	      REG_SET_TO_HARD_REG_SET (live_at_edge,
! 				       src_bb->global_live_at_end);
  
  	      start_sequence ();
  	      EMIT_MODE_SET (entity_map[j], mode, live_at_edge);
--- 583,589 ----
  	      src_bb = eg->src;
  
  	      REG_SET_TO_HARD_REG_SET (live_at_edge,
! 				       src_bb->il.rtl->global_live_at_end);
  
  	      start_sequence ();
  	      EMIT_MODE_SET (entity_map[j], mode, live_at_edge);
Index: postreload.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/postreload.c,v
retrieving revision 2.30
diff -c -3 -p -r2.30 postreload.c
*** postreload.c	29 Apr 2005 18:39:22 -0000	2.30
--- postreload.c	10 Jun 2005 12:09:56 -0000
*************** reload_combine (void)
*** 739,747 ****
  	  HARD_REG_SET live;
  
  	  REG_SET_TO_HARD_REG_SET (live,
! 				   bb->global_live_at_start);
  	  compute_use_by_pseudos (&live,
! 				  bb->global_live_at_start);
  	  COPY_HARD_REG_SET (LABEL_LIVE (insn), live);
  	  IOR_HARD_REG_SET (ever_live_at_start, live);
  	}
--- 739,747 ----
  	  HARD_REG_SET live;
  
  	  REG_SET_TO_HARD_REG_SET (live,
! 				   bb->il.rtl->global_live_at_start);
  	  compute_use_by_pseudos (&live,
! 				  bb->il.rtl->global_live_at_start);
  	  COPY_HARD_REG_SET (LABEL_LIVE (insn), live);
  	  IOR_HARD_REG_SET (ever_live_at_start, live);
  	}
Index: recog.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/recog.c,v
retrieving revision 1.222
diff -c -3 -p -r1.222 recog.c
*** recog.c	10 Apr 2005 04:00:46 -0000	1.222
--- recog.c	10 Jun 2005 12:09:57 -0000
*************** peephole2_optimize (FILE *dump_file ATTR
*** 3066,3072 ****
        peep2_current = MAX_INSNS_PER_PEEP2;
  
        /* Start up propagation.  */
!       COPY_REG_SET (live, bb->global_live_at_end);
        COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
  
  #ifdef HAVE_conditional_execution
--- 3066,3072 ----
        peep2_current = MAX_INSNS_PER_PEEP2;
  
        /* Start up propagation.  */
!       COPY_REG_SET (live, bb->il.rtl->global_live_at_end);
        COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
  
  #ifdef HAVE_conditional_execution
*************** peephole2_optimize (FILE *dump_file ATTR
*** 3278,3284 ****
  
        /* Some peepholes can decide the don't need one or more of their
  	 inputs.  If this happens, local life update is not enough.  */
!       EXECUTE_IF_AND_COMPL_IN_BITMAP (bb->global_live_at_start, live,
  				      0, j, rsi)
  	{
  	  do_global_life_update = true;
--- 3278,3284 ----
  
        /* Some peepholes can decide the don't need one or more of their
  	 inputs.  If this happens, local life update is not enough.  */
!       EXECUTE_IF_AND_COMPL_IN_BITMAP (bb->il.rtl->global_live_at_start, live,
  				      0, j, rsi)
  	{
  	  do_global_life_update = true;
Index: reg-stack.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reg-stack.c,v
retrieving revision 1.183
diff -c -3 -p -r1.183 reg-stack.c
*** reg-stack.c	4 Jun 2005 22:05:35 -0000	1.183
--- reg-stack.c	10 Jun 2005 12:09:57 -0000
*************** reg_to_stack (FILE *file)
*** 3076,3084 ****
        /* Copy live_at_end and live_at_start into temporaries.  */
        for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
  	{
! 	  if (REGNO_REG_SET_P (bb->global_live_at_end, reg))
  	    SET_HARD_REG_BIT (bi->out_reg_set, reg);
! 	  if (REGNO_REG_SET_P (bb->global_live_at_start, reg))
  	    SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
  	}
      }
--- 3076,3084 ----
        /* Copy live_at_end and live_at_start into temporaries.  */
        for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
  	{
! 	  if (REGNO_REG_SET_P (bb->il.rtl->global_live_at_end, reg))
  	    SET_HARD_REG_BIT (bi->out_reg_set, reg);
! 	  if (REGNO_REG_SET_P (bb->il.rtl->global_live_at_start, reg))
  	    SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
  	}
      }
Index: regmove.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/regmove.c,v
retrieving revision 1.168
diff -c -3 -p -r1.168 regmove.c
*** regmove.c	28 Apr 2005 05:38:34 -0000	1.168
--- regmove.c	10 Jun 2005 12:09:57 -0000
*************** mark_flags_life_zones (rtx flags)
*** 266,272 ****
        {
  	int i;
  	for (i = 0; i < flags_nregs; ++i)
! 	  live |= REGNO_REG_SET_P (block->global_live_at_start,
  				   flags_regno + i);
        }
  #endif
--- 266,272 ----
        {
  	int i;
  	for (i = 0; i < flags_nregs; ++i)
! 	  live |= REGNO_REG_SET_P (block->il.rtl->global_live_at_start,
  				   flags_regno + i);
        }
  #endif
Index: regrename.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/regrename.c,v
retrieving revision 1.97
diff -c -3 -p -r1.97 regrename.c
*** regrename.c	11 Mar 2005 09:05:06 -0000	1.97
--- regrename.c	10 Jun 2005 12:09:57 -0000
*************** merge_overlapping_regs (basic_block b, H
*** 142,148 ****
    rtx insn;
    HARD_REG_SET live;
  
!   REG_SET_TO_HARD_REG_SET (live, b->global_live_at_start);
    insn = BB_HEAD (b);
    while (t)
      {
--- 142,148 ----
    rtx insn;
    HARD_REG_SET live;
  
!   REG_SET_TO_HARD_REG_SET (live, b->il.rtl->global_live_at_start);
    insn = BB_HEAD (b);
    while (t)
      {
Index: reload.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reload.c,v
retrieving revision 1.271
diff -c -3 -p -r1.271 reload.c
*** reload.c	28 Apr 2005 20:36:56 -0000	1.271
--- reload.c	10 Jun 2005 12:09:58 -0000
*************** push_reload (rtx in, rtx out, rtx *inloc
*** 1537,1543 ****
  	    /* Check that we don't use a hardreg for an uninitialized
  	       pseudo.  See also find_dummy_reload().  */
  	    && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
! 		|| ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
  				   ORIGINAL_REGNO (XEXP (note, 0))))
  	    && ! refers_to_regno_for_reload_p (regno,
  					       (regno
--- 1537,1543 ----
  	    /* Check that we don't use a hardreg for an uninitialized
  	       pseudo.  See also find_dummy_reload().  */
  	    && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
! 		|| ! bitmap_bit_p (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end,
  				   ORIGINAL_REGNO (XEXP (note, 0))))
  	    && ! refers_to_regno_for_reload_p (regno,
  					       (regno
*************** find_dummy_reload (rtx real_in, rtx real
*** 2011,2017 ****
  	   as they would clobber the other live pseudo using the same.
  	   See also PR20973.  */
        && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
!           || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
  			     ORIGINAL_REGNO (in))))
      {
        unsigned int regno = REGNO (in) + in_offset;
--- 2011,2017 ----
  	   as they would clobber the other live pseudo using the same.
  	   See also PR20973.  */
        && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
!           || ! bitmap_bit_p (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end,
  			     ORIGINAL_REGNO (in))))
      {
        unsigned int regno = REGNO (in) + in_offset;
Index: reload1.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reload1.c,v
retrieving revision 1.474
diff -c -3 -p -r1.474 reload1.c
*** reload1.c	3 Jun 2005 09:55:28 -0000	1.474
--- reload1.c	10 Jun 2005 12:09:58 -0000
*************** reload (rtx first, int global)
*** 1092,1098 ****
  
    if (! frame_pointer_needed)
      FOR_EACH_BB (bb)
!       CLEAR_REGNO_REG_SET (bb->global_live_at_start,
  			   HARD_FRAME_POINTER_REGNUM);
  
    /* Come here (with failure set nonzero) if we can't get enough spill
--- 1092,1098 ----
  
    if (! frame_pointer_needed)
      FOR_EACH_BB (bb)
!       CLEAR_REGNO_REG_SET (bb->il.rtl->global_live_at_start,
  			   HARD_FRAME_POINTER_REGNUM);
  
    /* Come here (with failure set nonzero) if we can't get enough spill
Index: resource.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/resource.c,v
retrieving revision 1.79
diff -c -3 -p -r1.79 resource.c
*** resource.c	28 Apr 2005 05:03:08 -0000	1.79
--- resource.c	10 Jun 2005 12:09:58 -0000
*************** mark_target_live_regs (rtx insns, rtx ta
*** 965,971 ****
       TARGET.  Otherwise, we must assume everything is live.  */
    if (b != -1)
      {
!       regset regs_live = BASIC_BLOCK (b)->global_live_at_start;
        unsigned int j;
        unsigned int regno;
        rtx start_insn, stop_insn;
--- 965,971 ----
       TARGET.  Otherwise, we must assume everything is live.  */
    if (b != -1)
      {
!       regset regs_live = BASIC_BLOCK (b)->il.rtl->global_live_at_start;
        unsigned int j;
        unsigned int regno;
        rtx start_insn, stop_insn;
Index: sched-ebb.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/sched-ebb.c,v
retrieving revision 1.42
diff -c -3 -p -r1.42 sched-ebb.c
*** sched-ebb.c	3 Dec 2004 23:02:33 -0000	1.42
--- sched-ebb.c	10 Jun 2005 12:09:58 -0000
*************** compute_jump_reg_dependencies (rtx insn,
*** 183,191 ****
  	 it may guard the fallthrough block from using a value that has
  	 conditionally overwritten that of the main codepath.  So we
  	 consider that it restores the value of the main codepath.  */
!       bitmap_and (set, e->dest->global_live_at_start, cond_set);
      else
!       bitmap_ior_into (used, e->dest->global_live_at_start);
  }
  
  /* Used in schedule_insns to initialize current_sched_info for scheduling
--- 183,191 ----
  	 it may guard the fallthrough block from using a value that has
  	 conditionally overwritten that of the main codepath.  So we
  	 consider that it restores the value of the main codepath.  */
!       bitmap_and (set, e->dest->il.rtl->global_live_at_start, cond_set);
      else
!       bitmap_ior_into (used, e->dest->il.rtl->global_live_at_start);
  }
  
  /* Used in schedule_insns to initialize current_sched_info for scheduling
Index: sched-rgn.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/sched-rgn.c,v
retrieving revision 1.94
diff -c -3 -p -r1.94 sched-rgn.c
*** sched-rgn.c	7 Jun 2005 14:30:21 -0000	1.94
--- sched-rgn.c	10 Jun 2005 12:09:58 -0000
*************** check_live_1 (int src, rtx x)
*** 1184,1190 ****
  		{
  		  basic_block b = candidate_table[src].split_bbs.first_member[i];
  
! 		  if (REGNO_REG_SET_P (b->global_live_at_start, regno + j))
  		    {
  		      return 0;
  		    }
--- 1184,1191 ----
  		{
  		  basic_block b = candidate_table[src].split_bbs.first_member[i];
  
! 		  if (REGNO_REG_SET_P (b->il.rtl->global_live_at_start,
! 				       regno + j))
  		    {
  		      return 0;
  		    }
*************** check_live_1 (int src, rtx x)
*** 1198,1204 ****
  	    {
  	      basic_block b = candidate_table[src].split_bbs.first_member[i];
  
! 	      if (REGNO_REG_SET_P (b->global_live_at_start, regno))
  		{
  		  return 0;
  		}
--- 1199,1205 ----
  	    {
  	      basic_block b = candidate_table[src].split_bbs.first_member[i];
  
! 	      if (REGNO_REG_SET_P (b->il.rtl->global_live_at_start, regno))
  		{
  		  return 0;
  		}
*************** update_live_1 (int src, rtx x)
*** 1257,1263 ****
  		{
  		  basic_block b = candidate_table[src].update_bbs.first_member[i];
  
! 		  SET_REGNO_REG_SET (b->global_live_at_start, regno + j);
  		}
  	    }
  	}
--- 1258,1265 ----
  		{
  		  basic_block b = candidate_table[src].update_bbs.first_member[i];
  
! 		  SET_REGNO_REG_SET (b->il.rtl->global_live_at_start,
! 				     regno + j);
  		}
  	    }
  	}
*************** update_live_1 (int src, rtx x)
*** 1267,1273 ****
  	    {
  	      basic_block b = candidate_table[src].update_bbs.first_member[i];
  
! 	      SET_REGNO_REG_SET (b->global_live_at_start, regno);
  	    }
  	}
      }
--- 1269,1275 ----
  	    {
  	      basic_block b = candidate_table[src].update_bbs.first_member[i];
  
! 	      SET_REGNO_REG_SET (b->il.rtl->global_live_at_start, regno);
  	    }
  	}
      }
Index: config/frv/frv.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/frv/frv.c,v
retrieving revision 1.90
diff -c -3 -p -r1.90 frv.c
*** config/frv/frv.c	8 Jun 2005 05:05:17 -0000	1.90
--- config/frv/frv.c	10 Jun 2005 12:10:01 -0000
*************** frv_ifcvt_modify_tests (ce_if_block_t *c
*** 5265,5277 ****
        for (j = CC_FIRST; j <= CC_LAST; j++)
  	if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
  	  {
! 	    if (REGNO_REG_SET_P (then_bb->global_live_at_start, j))
  	      continue;
  
! 	    if (else_bb && REGNO_REG_SET_P (else_bb->global_live_at_start, j))
  	      continue;
  
! 	    if (join_bb && REGNO_REG_SET_P (join_bb->global_live_at_start, j))
  	      continue;
  
  	    SET_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j);
--- 5265,5279 ----
        for (j = CC_FIRST; j <= CC_LAST; j++)
  	if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
  	  {
! 	    if (REGNO_REG_SET_P (then_bb->il.rtl->global_live_at_start, j))
  	      continue;
  
! 	    if (else_bb
! 		&& REGNO_REG_SET_P (else_bb->il.rtl->global_live_at_start, j))
  	      continue;
  
! 	    if (join_bb
! 		&& REGNO_REG_SET_P (join_bb->il.rtl->global_live_at_start, j))
  	      continue;
  
  	    SET_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j);
*************** frv_ifcvt_modify_tests (ce_if_block_t *c
*** 5293,5299 ****
  
        /* Remove anything live at the beginning of the join block from being
           available for allocation.  */
!       EXECUTE_IF_SET_IN_REG_SET (join_bb->global_live_at_start, 0, regno, rsi)
  	{
  	  if (regno < FIRST_PSEUDO_REGISTER)
  	    CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
--- 5295,5301 ----
  
        /* Remove anything live at the beginning of the join block from being
           available for allocation.  */
!       EXECUTE_IF_SET_IN_REG_SET (join_bb->il.rtl->global_live_at_start, 0, regno, rsi)
  	{
  	  if (regno < FIRST_PSEUDO_REGISTER)
  	    CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
*************** frv_ifcvt_modify_tests (ce_if_block_t *c
*** 5337,5343 ****
  
        /* Anything live at the beginning of the block is obviously unavailable
           for allocation.  */
!       EXECUTE_IF_SET_IN_REG_SET (bb[j]->global_live_at_start, 0, regno, rsi)
  	{
  	  if (regno < FIRST_PSEUDO_REGISTER)
  	    CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
--- 5339,5345 ----
  
        /* Anything live at the beginning of the block is obviously unavailable
           for allocation.  */
!       EXECUTE_IF_SET_IN_REG_SET (bb[j]->il.rtl->global_live_at_start, 0, regno, rsi)
  	{
  	  if (regno < FIRST_PSEUDO_REGISTER)
  	    CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
*************** frv_ifcvt_modify_insn (ce_if_block_t *ce
*** 5991,5997 ****
  		  severely.  */
  	       && ce_info->join_bb
  	       && ! (REGNO_REG_SET_P
! 		     (ce_info->join_bb->global_live_at_start,
  		      REGNO (SET_DEST (set))))
  	       /* Similarly, we must not unconditionally set a reg
  		  used as scratch in the THEN branch if the same reg
--- 5993,5999 ----
  		  severely.  */
  	       && ce_info->join_bb
  	       && ! (REGNO_REG_SET_P
! 		     (ce_info->join_bb->il.rtl->global_live_at_start,
  		      REGNO (SET_DEST (set))))
  	       /* Similarly, we must not unconditionally set a reg
  		  used as scratch in the THEN branch if the same reg
*************** frv_ifcvt_modify_insn (ce_if_block_t *ce
*** 5999,6005 ****
  	       && (! ce_info->else_bb
  		   || BLOCK_FOR_INSN (insn) == ce_info->else_bb
  		   || ! (REGNO_REG_SET_P
! 			 (ce_info->else_bb->global_live_at_start,
  			  REGNO (SET_DEST (set))))))
  	pattern = set;
  
--- 6001,6007 ----
  	       && (! ce_info->else_bb
  		   || BLOCK_FOR_INSN (insn) == ce_info->else_bb
  		   || ! (REGNO_REG_SET_P
! 			 (ce_info->else_bb->il.rtl->global_live_at_start,
  			  REGNO (SET_DEST (set))))))
  	pattern = set;
  
Index: config/i386/i386.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.c,v
retrieving revision 1.827
diff -c -3 -p -r1.827 i386.c
*** config/i386/i386.c	9 Jun 2005 03:53:20 -0000	1.827
--- config/i386/i386.c	10 Jun 2005 12:10:02 -0000
*************** ix86_eax_live_at_start_p (void)
*** 1915,1921 ****
       to correct at this point.  This gives false positives for broken
       functions that might use uninitialized data that happens to be
       allocated in eax, but who cares?  */
!   return REGNO_REG_SET_P (ENTRY_BLOCK_PTR->global_live_at_end, 0);
  }
  
  /* Value is the number of bytes of arguments automatically
--- 1915,1921 ----
       to correct at this point.  This gives false positives for broken
       functions that might use uninitialized data that happens to be
       allocated in eax, but who cares?  */
!   return REGNO_REG_SET_P (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end, 0);
  }
  
  /* Value is the number of bytes of arguments automatically
Index: config/ia64/ia64.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/ia64/ia64.c,v
retrieving revision 1.375
diff -c -3 -p -r1.375 ia64.c
*** config/ia64/ia64.c	9 Jun 2005 17:38:05 -0000	1.375
--- config/ia64/ia64.c	10 Jun 2005 12:10:03 -0000
*************** emit_predicate_relation_info (void)
*** 7417,7423 ****
        /* Skip p0, which may be thought to be live due to (reg:DI p0)
  	 grabbing the entire block of predicate registers.  */
        for (r = PR_REG (2); r < PR_REG (64); r += 2)
! 	if (REGNO_REG_SET_P (bb->global_live_at_start, r))
  	  {
  	    rtx p = gen_rtx_REG (BImode, r);
  	    rtx n = emit_insn_after (gen_pred_rel_mutex (p), head);
--- 7417,7423 ----
        /* Skip p0, which may be thought to be live due to (reg:DI p0)
  	 grabbing the entire block of predicate registers.  */
        for (r = PR_REG (2); r < PR_REG (64); r += 2)
! 	if (REGNO_REG_SET_P (bb->il.rtl->global_live_at_start, r))
  	  {
  	    rtx p = gen_rtx_REG (BImode, r);
  	    rtx n = emit_insn_after (gen_pred_rel_mutex (p), head);


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