This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: i386-linux cross sh-elf breakage
- To: Richard Henderson <rth at cygnus dot com>
- Subject: Re: i386-linux cross sh-elf breakage
- From: Clinton Popetz <cpopetz at cygnus dot com>
- Date: Wed, 24 May 2000 11:56:05 -0500
- Cc: Toshiyasu Morita <tm at netcom dot com>, gcc-patches at gcc dot gnu dot org
- References: <200005152231.PAA01084@netcom.com> <20000516140146.A17877@cpopetz.com> <20000516175851.C7380@cygnus.com> <20000516212713.B4299@cpopetz.com> <20000518204943.B11020@cygnus.com> <20000519162632.A3003@cpopetz.com> <20000519174108.A15634@cygnus.com>
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) \