target.h (struct gcc_target): Add hard_regno_scratch_ok field.
authorAnatoly Sokolov <aesok@post.ru>
Wed, 9 Jul 2008 13:43:11 +0000 (17:43 +0400)
committerAnatoly Sokolov <aesok@gcc.gnu.org>
Wed, 9 Jul 2008 13:43:11 +0000 (17:43 +0400)
* 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

gcc/ChangeLog
gcc/Makefile.in
gcc/doc/tm.texi
gcc/recog.c
gcc/target-def.h
gcc/target.h
gcc/targhooks.c
gcc/targhooks.h

index c579c50da1d097d46fcd8c145fcc26ae8a5622d7..8fabd6d820b15784bde266e7f855475fa8405fb7 100644 (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.
index 1bd7ed49de8966768f1526c7e029a88c68069882..93acc465e0748f41b1435383dbfd59ae442a3152 100644 (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) \
index b5418a3f465d16e541132cfea37c82a4d0851d90..586001869406dcc0511430b62ff2329217a82907 100644 (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
index 3ddfd86c63585246dafc4b4ff32a90a7b23071fd..73d576478771183480bdfd90b62fe5ffdb61be68 100644 (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))
index 7ffb134602183224af829a9e6bc26f33652496a8..29ed88873b2a1688d1771de6d102291c33601f57 100644 (file)
 #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
   TARGET_SECONDARY_RELOAD,                     \
   TARGET_EXPAND_TO_RTL_HOOK,                   \
   TARGET_INSTANTIATE_DECLS,                    \
+  TARGET_HARD_REGNO_SCRATCH_OK,                        \
   TARGET_C,                                    \
   TARGET_CXX,                                  \
   TARGET_EMUTLS,                               \
index 11852430c8d3642d6dbb74334af3fc62fee3c585..d1642ef9497c096073079b4080b9c77a3e5e2ae2 100644 (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
index 7e931c5ed9d353456dfd36c7e282cd453495c982..1cb561480b882eb632bf6fd68ef373853b65336e 100644 (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"
index 5aebc7e667b2baace84e9883d82d7ce32a859244..4ad0fc86805f9e873a4bb2711e03d549bc5d2e96 100644 (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);