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]

condexec merge part 2


Change life_analysis to take PROP_* flags like the other functions
in that family.  This should also cure the SSA bugs seen on ARM due
to being premature with the autoinc optimizations.


r~

        * basic-block.h (life_analysis): Declare here ...
        * output.h: ... not here.
        * flow.c (life_analysis): Remove nregs parameter; replace
        remove_dead_code with flags.  Remove ssa dead code check.
        Only init alias analysis if we'll use it.
        * reg-stack.c (reg_to_stack): Update life_analysis arguments.
        * ssa.c (convert_to_ssa): Likewise.
        (convert_from_ssa): Likewise.
        * toplev.c (rest_of_compilation): Likewise.

Index: basic-block.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/basic-block.h,v
retrieving revision 1.63
diff -c -p -d -r1.63 basic-block.h
*** basic-block.h	2000/04/27 04:26:47	1.63
--- basic-block.h	2000/04/27 04:38:35
*************** enum update_life_extent
*** 427,432 ****
--- 427,433 ----
  #define PROP_AUTOINC		32	/* Create autoinc mem references.  */
  #define PROP_FINAL		63	/* All of the above.  */
  
+ extern void life_analysis	PARAMS ((rtx, FILE *, int));
  extern void update_life_info	PARAMS ((sbitmap, enum update_life_extent,
  					 int));
  extern int count_or_remove_death_notes	PARAMS ((sbitmap, int));
Index: flow.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/flow.c,v
retrieving revision 1.257
diff -c -p -d -r1.257 flow.c
*** flow.c	2000/04/27 04:26:47	1.257
--- flow.c	2000/04/27 04:38:36
*************** calculate_loop_depth (dump)
*** 2491,2522 ****
  }
  
  /* Perform data flow analysis.
!    F is the first insn of the function and NREGS the number of register numbers
!    in use.  */
  
  void
! life_analysis (f, nregs, file, remove_dead_code)
       rtx f;
-      int nregs;
       FILE *file;
!      int remove_dead_code;
  {
  #ifdef ELIMINABLE_REGS
    register int i;
    static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
  #endif
-   int flags;
    sbitmap all_blocks;
  
-   /* Dead code elimination changes basic block structure and therefore
-      breaks the SSA phi representation.  Particularly, a phi node
-      can have an alternative value for each incoming block, referenced
-      by the block number.  Removing dead code can bump entire blocks
-      and therefore cause blocks to be renumbered, invalidating the
-      numbering of phi alternatives.  */
-   if (remove_dead_code && in_ssa_form)
-     abort ();
-  
    /* Record which registers will be eliminated.  We use this in
       mark_used_regs.  */
  
--- 2491,2511 ----
  }
  
  /* Perform data flow analysis.
!    F is the first insn of the function; FLAGS is a set of PROP_* flags
!    to be used in accumulating flow info.  */
  
  void
! life_analysis (f, file, flags)
       rtx f;
       FILE *file;
!      int flags;
  {
  #ifdef ELIMINABLE_REGS
    register int i;
    static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
  #endif
    sbitmap all_blocks;
  
    /* Record which registers will be eliminated.  We use this in
       mark_used_regs.  */
  
*************** life_analysis (f, nregs, file, remove_de
*** 2529,2545 ****
    SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
  #endif
  
-   /* We want alias analysis information for local dead store elimination.  */
-   init_alias_analysis ();
- 
    if (! optimize)
!     flags = PROP_DEATH_NOTES | PROP_REG_INFO;
!   else
!     {
!       flags = PROP_FINAL;
!       if (! remove_dead_code)
! 	flags &= ~(PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE);
!     }
  
    /* The post-reload life analysis have (on a global basis) the same
       registers live as was computed by reload itself.  elimination
--- 2518,2525 ----
    SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
  #endif
  
    if (! optimize)
!     flags &= PROP_DEATH_NOTES | PROP_REG_INFO;
  
    /* The post-reload life analysis have (on a global basis) the same
       registers live as was computed by reload itself.  elimination
*************** life_analysis (f, nregs, file, remove_de
*** 2550,2556 ****
    if (reload_completed)
      flags &= ~PROP_REG_INFO;
  
!   max_regno = nregs;
  
    /* Always remove no-op moves.  Do this before other processing so
       that we don't have to keep re-scanning them.  */
--- 2530,2540 ----
    if (reload_completed)
      flags &= ~PROP_REG_INFO;
  
!   /* We want alias analysis information for local dead store elimination.  */
!   if (flags & PROP_SCAN_DEAD_CODE)
!     init_alias_analysis ();
! 
!   max_regno = max_reg_num ();
  
    /* Always remove no-op moves.  Do this before other processing so
       that we don't have to keep re-scanning them.  */
*************** life_analysis (f, nregs, file, remove_de
*** 2582,2588 ****
  
    /* Clean up.  */
    sbitmap_free (all_blocks);
!   end_alias_analysis ();
  
    if (file)
      dump_flow_info (file);
--- 2566,2574 ----
  
    /* Clean up.  */
    sbitmap_free (all_blocks);
! 
!   if (flags & PROP_SCAN_DEAD_CODE)
!     end_alias_analysis ();
  
    if (file)
      dump_flow_info (file);
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.45
diff -c -p -d -r1.45 output.h
*** output.h	2000/03/09 19:01:47	1.45
--- output.h	2000/04/27 04:38:36
*************** extern void cleanup_cfg			PARAMS ((rtx))
*** 137,143 ****
  extern void calculate_loop_depth      PARAMS ((FILE *));
  extern void free_basic_block_vars     PARAMS ((int));
  extern void set_block_num             PARAMS ((rtx, int));
- extern void life_analysis             PARAMS ((rtx, int, FILE *, int));
  #endif
  
  /* Functions in varasm.c.  */
--- 137,142 ----
Index: reg-stack.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/reg-stack.c,v
retrieving revision 1.58
diff -c -p -d -r1.58 reg-stack.c
*** reg-stack.c	2000/04/26 00:43:09	1.58
--- reg-stack.c	2000/04/27 04:38:36
*************** reg_to_stack (first, file)
*** 435,441 ****
       build the CFG and run life analysis.  */
    find_basic_blocks (first, max_reg_num (), file);
    count_or_remove_death_notes (NULL, 1);
!   life_analysis (first, max_reg_num (), file, 0);
  
    /* Set up block info for each basic block.  */
    bi = (block_info) xcalloc ((n_basic_blocks + 1), sizeof (*bi));
--- 435,441 ----
       build the CFG and run life analysis.  */
    find_basic_blocks (first, max_reg_num (), file);
    count_or_remove_death_notes (NULL, 1);
!   life_analysis (first, file, PROP_DEATH_NOTES);
  
    /* Set up block info for each basic block.  */
    bi = (block_info) xcalloc ((n_basic_blocks + 1), sizeof (*bi));
Index: ssa.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ssa.c,v
retrieving revision 1.8
diff -c -p -d -r1.8 ssa.c
*** ssa.c	2000/04/09 01:16:44	1.8
--- ssa.c	2000/04/27 04:38:36
*************** convert_to_ssa()
*** 855,861 ****
    if (in_ssa_form)
      abort ();
  
!   life_analysis (get_insns (), max_reg_num (), NULL, 1);
  
    /* Compute dominators.  */
    dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
--- 855,861 ----
    if (in_ssa_form)
      abort ();
  
!   life_analysis (get_insns (), NULL, PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE);
  
    /* Compute dominators.  */
    dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
*************** convert_from_ssa()
*** 1812,1818 ****
      
    /* We need up-to-date life information.  */
    compute_bb_for_insn (get_max_uid ());
!   life_analysis (insns, max_reg_num (), NULL, 0);
  
    /* Figure out which regs in copies and phi nodes don't conflict and
       therefore can be coalesced.  */
--- 1812,1818 ----
      
    /* We need up-to-date life information.  */
    compute_bb_for_insn (get_max_uid ());
!   life_analysis (insns, NULL, PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE);
  
    /* Figure out which regs in copies and phi nodes don't conflict and
       therefore can be coalesced.  */
Index: toplev.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/toplev.c,v
retrieving revision 1.323
diff -c -p -d -r1.323 toplev.c
*** toplev.c	2000/04/26 00:36:55	1.323
--- toplev.c	2000/04/27 04:38:36
*************** rest_of_compilation (decl)
*** 3247,3253 ****
         cleanup_cfg (insns);
         if (optimize)
  	 calculate_loop_depth (rtl_dump_file);
!        life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
         mark_constant_function ();
       });
  
--- 3247,3253 ----
         cleanup_cfg (insns);
         if (optimize)
  	 calculate_loop_depth (rtl_dump_file);
!        life_analysis (insns, rtl_dump_file, PROP_FINAL);
         mark_constant_function ();
       });
  
*************** rest_of_compilation (decl)
*** 3434,3440 ****
        TIMEVAR (flow2_time,
  	       {
  		 cleanup_cfg (insns);
! 		 life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
  	       });
  
        /* This is kind of heruistics.  We need to run combine_stack_adjustments
--- 3434,3440 ----
        TIMEVAR (flow2_time,
  	       {
  		 cleanup_cfg (insns);
! 		 life_analysis (insns, rtl_dump_file, PROP_FINAL);
  	       });
  
        /* This is kind of heruistics.  We need to run combine_stack_adjustments

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