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]

Re: i386-linux cross sh-elf breakage


On Fri, May 19, 2000 at 05:41:08PM -0700, Richard Henderson wrote:
> On Fri, May 19, 2000 at 04:26:32PM -0500, Clinton Popetz wrote:
> > 	(optimize_mode_switching): Use MODE_AT_EXIT instead of 
> > 	MODE_USES_IN_EXIT_BLOCK.  Change leftover instance of
> > 	FP_MODE_NONE to no_mode.
> 
> I don't see the need for MODE_AT_EXIT.  It's always going
> to be the same as MODE_AT_ENTRY.  In any sane system anyway.
> You could rename it if you like to be more clear on that fact;
> certainly that's not a large change at this point.

I assumed Joern had his reasons to distinguish the two.  I've
collapsed them to "NORMAL_MODE."

> > + #ifdef MODE_AT_EXIT
> > + 	  if (bb == (n_basic_blocks - 1) && MODE_AT_EXIT (e) != no_mode 
> > + 		  && last_mode != MODE_AT_EXIT (e))
> 
> Please don't assume (n_basic_blocks - 1).  Please follow the CFG
> edges back from EXIT.  It is rare, but not impossible, for a 
> target to have return insns at this stage.

Ok. There was a glitch that enable-checking exposed; the existing code
didn't handle insertions in EXIT blocks that only consisted of a label
and a NOTE_INSN_BASIC_BLOCK.   But other than that it's equivalent to
the previous patch modulo the above comments.  It passes regression
for sh.  

Wed May 24 11:55:24 2000  Clinton Popetz  <cpopetz@cygnus.com>

	* lcm.c (make_preds_opaque): Fix comment.
	(optimize_mode_switching): Use NORMAL_MODE instead of 
	MODE_USES_IN_EXIT_BLOCK.  Change leftover instance of
	FP_MODE_NONE to no_mode.  Rename MODE_AT_ENTRY to NORMAL_MODE.
	Handle insertions before an existing NOTE_INSN_BASIC_BLOCK.
	* tm.texi (OPTIMIZE_MODE_SWITCHING): Refer to NORMAL_MODE.
	(MODE_USES_IN_EXIT_BLOCK): Delete.
	(MODE_AT_ENTRY) Rename to NORMAL_MODE.
	* sh.h (MODE_USES_IN_EXIT_BLOCK): Delete.
	(MODE_AT_ENTRY): Rename to NORMAL_MODE.
	(MODE_NEEDED): Don't look for USE.
	(EPILOGUE_USES): Define.


 
Index: lcm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/lcm.c,v
retrieving revision 1.15
diff -c -2 -p -r1.15 lcm.c
*** lcm.c	2000/05/17 21:01:07	1.15
--- lcm.c	2000/05/24 16:51:47
*************** static sbitmap *delete;
*** 841,845 ****
  static sbitmap *insert;
  
! static struct seginfo * new_seginfo PARAMS ((int, rtx, int, HARD_REG_SET));;
  static void add_seginfo PARAMS ((struct bb_info *, struct seginfo *));
  static void reg_dies PARAMS ((rtx, HARD_REG_SET));
--- 841,845 ----
  static sbitmap *insert;
  
! static struct seginfo * new_seginfo PARAMS ((int, rtx, int, HARD_REG_SET));
  static void add_seginfo PARAMS ((struct bb_info *, struct seginfo *));
  static void reg_dies PARAMS ((rtx, HARD_REG_SET));
*************** static void make_preds_opaque PARAMS ((b
*** 851,855 ****
  
  /* This function will allocate a new BBINFO structure, initialized
!    with the FP_MODE, INSN, and basic block BB parameters.  */
  
  static struct seginfo *
--- 851,855 ----
  
  /* This function will allocate a new BBINFO structure, initialized
!    with the MODE, INSN, and basic block BB parameters.  */
  
  static struct seginfo *
*************** optimize_mode_switching (file)
*** 995,1021 ****
      return 0;
  
- #ifdef MODE_USES_IN_EXIT_BLOCK
-   /* For some ABIs a particular mode setting is required at function exit.  */
- 
-   for (eg = EXIT_BLOCK_PTR->pred; eg; eg = eg->pred_next)
-     {
-       int bb = eg->src->index;
-       rtx insn = BLOCK_END (bb);
-       rtx use = MODE_USES_IN_EXIT_BLOCK;
- 
-       /* If the block ends with the use of the return value
- 	 and / or a return, insert the new use(s) in front of them.  */
-       while ((GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == USE)
- 	     || GET_CODE (insn) == JUMP_INSN)
- 	insn = PREV_INSN (insn);
- 
-       use = emit_insn_after (use, insn);
-       if (insn == BLOCK_END (bb))
- 	BLOCK_END (bb) = use;
-       else if (NEXT_INSN (use) == BLOCK_HEAD (bb))
- 	BLOCK_HEAD (bb) = NEXT_INSN (insn);
-     }
- #endif /* MODE_USES_IN_EXIT_BLOCK */
- 
    /* Create the bitmap vectors.  */
  
--- 995,998 ----
*************** optimize_mode_switching (file)
*** 1072,1075 ****
--- 1049,1075 ----
  	    }
  
+ 	  /* If this is a predecessor of the exit block, and we must 
+ 	     force a mode on exit, make note of that.  */
+ #ifdef NORMAL_MODE
+ 	  if (NORMAL_MODE (e) != no_mode && last_mode != NORMAL_MODE (e))
+ 	    for (eg = BASIC_BLOCK (bb)->succ; eg; eg = eg->succ_next)
+ 	      if (eg->dest == EXIT_BLOCK_PTR)
+ 		{
+ 		  rtx insn = BLOCK_END (bb);
+ 
+ 		  /* Find the last insn before a USE and/or JUMP.  */
+ 		  while ((GET_CODE (insn) == INSN 
+ 			      && GET_CODE (PATTERN (insn)) == USE)
+ 			  || GET_CODE (insn) == JUMP_INSN)
+ 		    insn = PREV_INSN (insn);
+ 		  if (insn != BLOCK_END (bb) && NEXT_INSN (insn))
+ 		    insn = NEXT_INSN (insn);
+ 		  last_mode = NORMAL_MODE (e);
+ 		  add_seginfo (info + bb, 
+ 		      new_seginfo (last_mode, insn, bb, live_now));
+ 		  RESET_BIT (transp[bb], j);
+ 		} 
+ #endif
+ 
  	  info[bb].computing = last_mode;
  	  /* Check for blocks without ANY mode requirements.  */
*************** optimize_mode_switching (file)
*** 1080,1086 ****
  	    }
  	}
! #ifdef MODE_AT_ENTRY
        {
! 	int mode = MODE_AT_ENTRY (e);
  
  	if (mode != no_mode)
--- 1080,1086 ----
  	    }
  	}
! #ifdef NORMAL_MODE
        {
! 	int mode = NORMAL_MODE (e);
  
  	if (mode != no_mode)
*************** optimize_mode_switching (file)
*** 1113,1117 ****
  	  }
        }
! #endif /* MODE_AT_ENTRY */
      }
  
--- 1113,1117 ----
  	  }
        }
! #endif /* NORMAL_MODE */
      }
  
*************** optimize_mode_switching (file)
*** 1215,1218 ****
--- 1215,1220 ----
    for (j = n_entities - 1; j >= 0; j--)
      {
+       int no_mode = num_modes[entity_map[j]];
+ 
        for (bb = n_basic_blocks - 1; bb >= 0; bb--)
  	{
*************** optimize_mode_switching (file)
*** 1221,1225 ****
  	    {
  	      next = ptr->next;
! 	      if (ptr->mode != FP_MODE_NONE)
  		{
  		  rtx mode_set;
--- 1223,1227 ----
  	    {
  	      next = ptr->next;
! 	      if (ptr->mode != no_mode)
  		{
  		  rtx mode_set;
*************** optimize_mode_switching (file)
*** 1230,1235 ****
  		  end_sequence ();
  
! 		  emit_block_insn_before (mode_set, ptr->insn_ptr,
! 					  BASIC_BLOCK (ptr->bbnum));
  		}
  
--- 1232,1241 ----
  		  end_sequence ();
  
! 		  if (NOTE_LINE_NUMBER (ptr->insn_ptr) == NOTE_INSN_BASIC_BLOCK)
! 		    emit_block_insn_after (mode_set, ptr->insn_ptr,
!     		                           BASIC_BLOCK (ptr->bbnum));
! 		  else
! 		    emit_block_insn_before (mode_set, ptr->insn_ptr,
! 					    BASIC_BLOCK (ptr->bbnum));
  		}
  
Index: tm.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/tm.texi,v
retrieving revision 1.124
diff -c -2 -p -r1.124 tm.texi
*** tm.texi	2000/05/01 16:53:03	1.124
--- tm.texi	2000/05/24 16:51:54
*************** If you define this macro, you also have 
*** 7275,7279 ****
  @code{NUM_MODES_FOR_MODE_SWITCHING}, @code{MODE_NEEDED},
  @code{MODE_PRIORITY_TO_MODE} and @code{EMIT_MODE_SET}.
! @code{MODE_AT_ENTRY} and @code{MODE_USES_IN_EXIT_BLOCK} are optional.
  
  @findex NUM_MODES_FOR_MODE_SWITCHING
--- 7275,7279 ----
  @code{NUM_MODES_FOR_MODE_SWITCHING}, @code{MODE_NEEDED},
  @code{MODE_PRIORITY_TO_MODE} and @code{EMIT_MODE_SET}.
! @code{NORMAL_MODE} is optional.
  
  @findex NUM_MODES_FOR_MODE_SWITCHING
*************** represented as numbers 0 .. N - 1.  N is
*** 7290,7302 ****
  switch is needed / supplied.
  
- @findex MODE_USES_IN_EXIT_BLOCK
- @item MODE_USES_IN_EXIT_BLOCK
- If this macro is defined, it is called for each exit block when mode switching
- optimization is performed.  Its return value should be the pattern of an insn,
- or a sequence of insns.  It is emitted before the return insn / use insns at
- the end of the exit block.
- 
- This is done before insns are examined for their need of any mode switching.
- 
  @findex MODE_NEEDED
  @item MODE_NEEDED (@var{entity}, @var{insn})
--- 7290,7293 ----
*************** NUM_MODES_FOR_MODE_SWITCHING, to denote 
*** 7307,7315 ****
  be switched into prior to the execution of INSN.
  
! @findex MODE_AT_ENTRY
! @item MODE_AT_ENTRY (@var{entity})
  If this macro is defined, it is evaluated for every @var{entity} that needs
  mode switching.  It should evaluate to an integer, which is a mode that
! @var{entity} is assumed to be switched to at function entry.
  
  @findex MODE_PRIORITY_TO_MODE
--- 7298,7306 ----
  be switched into prior to the execution of INSN.
  
! @findex NORMAL_MODE 
! @item NORMAL_MODE (@var{entity})
  If this macro is defined, it is evaluated for every @var{entity} that needs
  mode switching.  It should evaluate to an integer, which is a mode that
! @var{entity} is assumed to be switched to at function entry and exit.
  
  @findex MODE_PRIORITY_TO_MODE
Index: config/sh/sh.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/sh/sh.h,v
retrieving revision 1.61
diff -c -2 -p -r1.61 sh.h
*** sh.h	2000/04/12 20:10:19	1.61
--- sh.h	2000/05/24 16:51:57
*************** do {									\
*** 2250,2265 ****
  #define OPTIMIZE_MODE_SWITCHING(ENTITY) TARGET_SH4
  
! #define MODE_USES_IN_EXIT_BLOCK gen_rtx_USE (VOIDmode, get_fpscr_rtx ())
  
  #define MODE_NEEDED(ENTITY, INSN)					\
    (recog_memoized (INSN) >= 0						\
     ? get_attr_fp_mode (INSN)						\
-    : (GET_CODE (PATTERN (INSN)) == USE				\
-       && rtx_equal_p (XEXP (PATTERN (INSN), 0), get_fpscr_rtx ()))	\
-    ? (TARGET_FPU_SINGLE ? FP_MODE_SINGLE : FP_MODE_DOUBLE)		\
     : FP_MODE_NONE)
- 
- #define MODE_AT_ENTRY(ENTITY) \
-   (TARGET_FPU_SINGLE ? FP_MODE_SINGLE : FP_MODE_DOUBLE)
  
  #define MODE_PRIORITY_TO_MODE(ENTITY, N) \
--- 2250,2262 ----
  #define OPTIMIZE_MODE_SWITCHING(ENTITY) TARGET_SH4
  
! #define NORMAL_MODE(ENTITY) \
!    (TARGET_FPU_SINGLE ? FP_MODE_SINGLE : FP_MODE_DOUBLE) 
  
+ #define EPILOGUE_USES(REGNO)       (TARGET_SH4 && (REGNO) == FPSCR_REG)
+ 
  #define MODE_NEEDED(ENTITY, INSN)					\
    (recog_memoized (INSN) >= 0						\
     ? get_attr_fp_mode (INSN)						\
     : FP_MODE_NONE)
  
  #define MODE_PRIORITY_TO_MODE(ENTITY, N) \

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