re PR target/64761 (-freorder-blocks-and-partition causes some failures on SH)
PR target/64761 Replace MD_REDIRECT_BRANCH with TARGET_CAN_FOLLOW_JUMP. Co-Authored-By: Kaz Kojima <kkojima@gcc.gnu.org> From-SVN: r220552
This commit is contained in:
parent
d51151b2f4
commit
cf6186e9f2
7 changed files with 19 additions and 31 deletions
|
@ -1,3 +1,16 @@
|
|||
2015-02-09 Joern Rennecke <joern.rennecke@embecosm.com>
|
||||
Kaz Kojima <kkojima@gcc.gnu.org>
|
||||
|
||||
PR target/64761
|
||||
* config/sh/sh-protos.h (sh_can_redirect_branch): Don't declare.
|
||||
* config/sh/sh.c (TARGET_CAN_FOLLOW_JUMP): Redefine.
|
||||
(sh_can_redirect_branch): Rename to ...
|
||||
(sh_can_follow_jump): ... this. Constify argument types.
|
||||
* config/sh/sh.h (MD_CAN_REDIRECT_BRANCH): Don't define.
|
||||
* doc/tm.texi.in (MD_CAN_REDIRECT_BRANCH): Remove documentation.
|
||||
* reorg.c (steal_delay_list_from_target): Use targetm.can_follow_jump.
|
||||
* doc/tm.texi: Regenerate.
|
||||
|
||||
2015-02-09 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR sanitizer/64981
|
||||
|
|
|
@ -148,7 +148,6 @@ extern enum tls_model tls_symbolic_operand (rtx, machine_mode);
|
|||
extern bool system_reg_operand (rtx, machine_mode);
|
||||
extern bool reg_unused_after (rtx, rtx_insn *);
|
||||
extern int sh_insn_length_adjustment (rtx_insn *);
|
||||
extern bool sh_can_redirect_branch (rtx_insn *, rtx_insn *);
|
||||
extern void sh_expand_unop_v2sf (enum rtx_code, rtx, rtx);
|
||||
extern void sh_expand_binop_v2sf (enum rtx_code, rtx, rtx, rtx);
|
||||
extern bool sh_expand_t_scc (rtx *);
|
||||
|
|
|
@ -277,6 +277,7 @@ static int sh_variable_issue (FILE *, int, rtx_insn *, int);
|
|||
static bool sh_function_ok_for_sibcall (tree, tree);
|
||||
|
||||
static bool sh_cannot_modify_jumps_p (void);
|
||||
static bool sh_can_follow_jump (const rtx_insn *, const rtx_insn *);
|
||||
static reg_class_t sh_target_reg_class (void);
|
||||
static bool sh_optimize_target_register_callee_saved (bool);
|
||||
static bool sh_ms_bitfield_layout_p (const_tree);
|
||||
|
@ -512,6 +513,8 @@ static const struct attribute_spec sh_attribute_table[] =
|
|||
|
||||
#undef TARGET_CANNOT_MODIFY_JUMPS_P
|
||||
#define TARGET_CANNOT_MODIFY_JUMPS_P sh_cannot_modify_jumps_p
|
||||
#undef TARGET_CAN_FOLLOW_JUMP
|
||||
#define TARGET_CAN_FOLLOW_JUMP sh_can_follow_jump
|
||||
#undef TARGET_BRANCH_TARGET_REGISTER_CLASS
|
||||
#define TARGET_BRANCH_TARGET_REGISTER_CLASS sh_target_reg_class
|
||||
#undef TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED
|
||||
|
@ -10822,8 +10825,8 @@ mark_constant_pool_use (rtx x)
|
|||
/* Return true if it's possible to redirect BRANCH1 to the destination
|
||||
of an unconditional jump BRANCH2. We only want to do this if the
|
||||
resulting branch will have a short displacement. */
|
||||
bool
|
||||
sh_can_redirect_branch (rtx_insn *branch1, rtx_insn *branch2)
|
||||
static bool
|
||||
sh_can_follow_jump (const rtx_insn *branch1, const rtx_insn *branch2)
|
||||
{
|
||||
if (flag_expensive_optimizations && simplejump_p (branch2))
|
||||
{
|
||||
|
|
|
@ -2245,9 +2245,6 @@ extern int current_function_interrupt;
|
|||
#define EPILOGUE_USES(REGNO) ((TARGET_SH2E || TARGET_SH4) \
|
||||
&& (REGNO) == FPSCR_REG)
|
||||
|
||||
#define MD_CAN_REDIRECT_BRANCH(INSN, SEQ) \
|
||||
sh_can_redirect_branch ((INSN), (SEQ))
|
||||
|
||||
#define DWARF_FRAME_RETURN_COLUMN \
|
||||
(TARGET_SH5 ? DWARF_FRAME_REGNUM (PR_MEDIA_REG) : DWARF_FRAME_REGNUM (PR_REG))
|
||||
|
||||
|
|
|
@ -11107,17 +11107,6 @@ loops containing function calls or branch on table instructions.
|
|||
Take an instruction in @var{insn} and return @code{false} if the instruction is not appropriate as a combination of two or more instructions. The default is to accept all instructions.
|
||||
@end deftypefn
|
||||
|
||||
@defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2})
|
||||
|
||||
Take a branch insn in @var{branch1} and another in @var{branch2}.
|
||||
Return true if redirecting @var{branch1} to the destination of
|
||||
@var{branch2} is possible.
|
||||
|
||||
On some targets, branches may have a limited range. Optimizing the
|
||||
filling of delay slots can result in branches being redirected, and this
|
||||
may in turn cause a branch offset to overflow.
|
||||
@end defmac
|
||||
|
||||
@deftypefn {Target Hook} bool TARGET_CAN_FOLLOW_JUMP (const rtx_insn *@var{follower}, const rtx_insn *@var{followee})
|
||||
FOLLOWER and FOLLOWEE are JUMP_INSN instructions; return true if FOLLOWER may be modified to follow FOLLOWEE; false, if it can't. For example, on some targets, certain kinds of branches can't be made to follow through a hot/cold partitioning.
|
||||
@end deftypefn
|
||||
|
|
|
@ -7982,17 +7982,6 @@ to by @var{ce_info}.
|
|||
|
||||
@hook TARGET_LEGITIMATE_COMBINED_INSN
|
||||
|
||||
@defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2})
|
||||
|
||||
Take a branch insn in @var{branch1} and another in @var{branch2}.
|
||||
Return true if redirecting @var{branch1} to the destination of
|
||||
@var{branch2} is possible.
|
||||
|
||||
On some targets, branches may have a limited range. Optimizing the
|
||||
filling of delay slots can result in branches being redirected, and this
|
||||
may in turn cause a branch offset to overflow.
|
||||
@end defmac
|
||||
|
||||
@hook TARGET_CAN_FOLLOW_JUMP
|
||||
|
||||
@hook TARGET_COMMUTATIVE_P
|
||||
|
|
|
@ -1156,13 +1156,11 @@ steal_delay_list_from_target (rtx_insn *insn, rtx condition, rtx_sequence *seq,
|
|||
|| ! single_set (seq->insn (0)))
|
||||
return delay_list;
|
||||
|
||||
#ifdef MD_CAN_REDIRECT_BRANCH
|
||||
/* On some targets, branches with delay slots can have a limited
|
||||
displacement. Give the back end a chance to tell us we can't do
|
||||
this. */
|
||||
if (! MD_CAN_REDIRECT_BRANCH (insn, seq->insn (0)))
|
||||
if (! targetm.can_follow_jump (insn, seq->insn (0)))
|
||||
return delay_list;
|
||||
#endif
|
||||
|
||||
redundant = XALLOCAVEC (bool, XVECLEN (seq, 0));
|
||||
for (i = 1; i < seq->len (); i++)
|
||||
|
|
Loading…
Add table
Reference in a new issue