target.h (struct gcc_target): Add hard_regno_scratch_ok field.

* target.h (struct gcc_target): Add hard_regno_scratch_ok field.
	* target-def.h (TARGET_HARD_REGNO_SCRATCH_OK): New.
	(TARGET_INITIALIZER): Use TARGET_HARD_REGNO_SCRATCH_OK.
	* targhooks.c (default_hard_regno_scratch_ok): New function.
	* targhooks.h (default_hard_regno_scratch_ok): Declare function.
	* doc/tm.texi: Document TARGET_HARD_REGNO_SCRATCH_OK hook.
	* recog.c:  Include "target.h".
	(peep2_find_free_register): Add check for global regs. Add target
	specific check.
	* Makefile.in (recog.o): Depend on target.h.

From-SVN: r137657
This commit is contained in:
Anatoly Sokolov 2008-07-09 17:43:11 +04:00 committed by Anatoly Sokolov
parent 28f16d05a0
commit dbc42c44d8
8 changed files with 48 additions and 1 deletions

View File

@ -1,3 +1,16 @@
2008-07-09 Anatoly Sokolov <aesok@post.ru>
* target.h (struct gcc_target): Add hard_regno_scratch_ok field.
* target-def.h (TARGET_HARD_REGNO_SCRATCH_OK): New.
(TARGET_INITIALIZER): Use TARGET_HARD_REGNO_SCRATCH_OK.
* targhooks.c (default_hard_regno_scratch_ok): New function.
* targhooks.h (default_hard_regno_scratch_ok): Declare function.
* doc/tm.texi: Document TARGET_HARD_REGNO_SCRATCH_OK hook.
* recog.c: Include "target.h".
(peep2_find_free_register): Add check for global regs. Add target
specific check.
* Makefile.in (recog.o): Depend on target.h.
2008-07-09 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c (sh_canonical_va_list_type): New.

View File

@ -2868,7 +2868,7 @@ recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(FUNCTION_H) $(BASIC_BLOCK_H) $(REGS_H) $(RECOG_H) $(EXPR_H) \
$(FLAGS_H) insn-config.h $(INSN_ATTR_H) toplev.h output.h reload.h \
addresses.h $(TM_P_H) $(TIMEVAR_H) tree-pass.h hard-reg-set.h $(REAL_H) \
$(DF_H) $(DBGCNT_H)
$(DF_H) $(DBGCNT_H) $(TARGET_H)
reg-stack.o : reg-stack.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(TREE_H) $(RECOG_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) \
insn-config.h toplev.h reload.h $(FUNCTION_H) $(TM_P_H) $(GGC_H) \

View File

@ -2242,6 +2242,16 @@ possible since doing so will allow GCC to perform better register
allocation.
@end defmac
@deftypefn {Target Hook} bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int @var{regno})
This target hook should return @code{true} if it is OK to use a hard register
@var{regno} as scratch reg in peephole2.
One common use of this macro is to prevent using of a register that
is not saved by a prologue in an interrupt handler.
The default version of this hook always returns @code{true}.
@end deftypefn
@defmac AVOID_CCMODE_COPIES
Define this macro if the compiler should avoid copies to/from @code{CCmode}
registers. You should only define this macro if support for copying to/from

View File

@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see
#include "basic-block.h"
#include "output.h"
#include "reload.h"
#include "target.h"
#include "timevar.h"
#include "tree-pass.h"
#include "df.h"
@ -2898,6 +2899,9 @@ peep2_find_free_register (int from, int to, const char *class_str,
/* Don't allocate fixed registers. */
if (fixed_regs[regno])
continue;
/* Don't allocate global registers. */
if (global_regs[regno])
continue;
/* Make sure the register is of the right class. */
if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno))
continue;
@ -2907,6 +2911,9 @@ peep2_find_free_register (int from, int to, const char *class_str,
/* And that we don't create an extra save/restore. */
if (! call_used_regs[regno] && ! df_regs_ever_live_p (regno))
continue;
if (! targetm.hard_regno_scratch_ok (regno))
continue;
/* And we don't clobber traceback for noreturn functions. */
if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
&& (! reload_completed || frame_pointer_needed))

View File

@ -619,6 +619,10 @@
#define TARGET_INSTANTIATE_DECLS hook_void_void
#endif
#ifndef TARGET_HARD_REGNO_SCRATCH_OK
#define TARGET_HARD_REGNO_SCRATCH_OK default_hard_regno_scratch_ok
#endif
/* C specific. */
#ifndef TARGET_C_MODE_FOR_SUFFIX
#define TARGET_C_MODE_FOR_SUFFIX default_mode_for_suffix
@ -846,6 +850,7 @@
TARGET_SECONDARY_RELOAD, \
TARGET_EXPAND_TO_RTL_HOOK, \
TARGET_INSTANTIATE_DECLS, \
TARGET_HARD_REGNO_SCRATCH_OK, \
TARGET_C, \
TARGET_CXX, \
TARGET_EMUTLS, \

View File

@ -872,6 +872,10 @@ struct gcc_target
but will be later. */
void (* instantiate_decls) (void);
/* Return true if is OK to use a hard register REGNO as scratch register
in peephole2. */
bool (* hard_regno_scratch_ok) (unsigned int regno);
/* Functions specific to the C family of frontends. */
struct c {
/* Return machine mode for non-standard suffix

View File

@ -703,4 +703,10 @@ default_builtin_vector_alignment_reachable (const_tree type, bool is_packed)
return true;
}
bool
default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
{
return true;
}
#include "gt-targhooks.h"

View File

@ -97,3 +97,5 @@ extern int default_reloc_rw_mask (void);
extern tree default_mangle_decl_assembler_name (tree, tree);
extern tree default_emutls_var_fields (tree, tree *);
extern tree default_emutls_var_init (tree, tree, tree);
extern bool default_hard_regno_scratch_ok (unsigned int);