Patchwork [2/3] tm.texi documentation on macro PREFERRED_RENAME_CLASS

login
register
mail settings
Submitter Yao Qi
Date Oct. 27, 2010, 4:13 p.m.
Message ID <1288195991.1793.111.camel@yaolp>
Download mbox | patch
Permalink /patch/69373/
State New
Headers show

Comments

Yao Qi - Oct. 27, 2010, 4:13 p.m.
On Wed, 2010-10-27 at 12:06 +0000, Joseph S. Myers wrote:
> On Wed, 27 Oct 2010, Yao Qi wrote:
> 
> > On Thu, 2010-10-21 at 22:04 +0000, Joseph S. Myers wrote:
> > > tm.texi is a generated file.  You need to patch tm.texi.in and regenerate 
> > > tm.texi.
> > > 
> > > In general new target macros should be avoided in favour of hooks (whose 
> > > documentation source should be in target.def with a minimal @hook 
> > > reference in tm.texi.in) unless one of the following applies:
> > 
> > Joseph,
> > It is patch 2 here, which adds target hook, doc and uses target hook.
> > This patch (patch 2) is dependent on patch 1
> > (http://gcc.gnu.org/ml/gcc-patches/2010-10/msg02197.html)
> 
> Please see what I said about putting the documentation in target.def.  
> tm.texi.in should *only* have the @hook line and not the rest of the 
> documentation.  Using "" for documentation in DEFHOOK in target.def is a 
> deprecated transitional measure for cases where documentation uses 
> pre-existing GFDL-only text, unless and until the FSF works out viable 
> arrangements for us to be able to move and copy text bidirectionally 
> between code and manuals in whatever ways make technical sense.
> 
[Click "Send" button by mistake.  Sorry.]
I misunderstood you a little bit in last mail.  Here is the new one.

Patch

gcc/

	* target.def: New hook preferred_rename_class.
	* targhook.c (default_preferred_rename_class): New.
	* targhook.h: Declare it.
	* regrename.c (regrename_optimize): Call target hook
	preferred_rename_class to rename register class.
	* doc/tm.texi.in: New hook TARGET_PREFERRED_RENAME_CLASS.

diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index a9592b1..d098d87 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -2585,6 +2585,8 @@  only if neither labeling works.
 This macro also has strict and non-strict variants.
 @end defmac
 
+@hook TARGET_PREFERRED_RENAME_CLASS
+
 @hook TARGET_PREFERRED_RELOAD_CLASS
 A target hook that places additional restrictions on the register class
 to use when it is necessary to copy value @var{x} into a register in class
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 11ae466..6189806 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -38,6 +38,7 @@ 
 #include "timevar.h"
 #include "tree-pass.h"
 #include "df.h"
+#include "target.h"
 
 #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
 #error "Use a different bitmap implementation for untracked_operands."
@@ -384,12 +385,15 @@  regrename_optimize (void)
 	  n_uses = 0;
 	  for (tmp = this_head->first; tmp; tmp = tmp->next_use)
 	    {
+	      enum reg_class cl;
 	      if (DEBUG_INSN_P (tmp->insn))
 		continue;
 	      n_uses++;
 
+	      cl = (enum reg_class) 
+		targetm.preferred_rename_class(tmp->cl);
 	      IOR_COMPL_HARD_REG_SET (this_unavailable,
-				      reg_class_contents[tmp->cl]);
+				      reg_class_contents[cl]);
 	    }
 
 	  if (n_uses < 2)
diff --git a/gcc/target.def b/gcc/target.def
index 82f3040..843ea8c 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -2089,6 +2089,20 @@  DEFHOOK
  bool, (reg_class_t rclass),
  default_class_likely_spilled_p)
 
+DEFHOOK
+(preferred_rename_class,
+ "A target hook that places additional restrictions on the register\
+ class to use when it is necessary to rename a register in class\
+ @var{class} to another class, or perhaps still @var{class},\
+ if you don't define macro @code{PREFERRED_RENAME_CLASS}.\
+ Sometimes returning a more restrictive class makes better code.  For\
+ example, on ARM, thumb-2 instructions using @code{LOW_REGS} may be\
+ smaller than instructions using @code{GENERIC_REGS}.  By returning\
+ @code{LOW_REGS} from @code{PREFERRED_RENAME_CLASS}, code size can\
+ be reduced.",
+ reg_class_t, (reg_class_t rclass),
+ default_preferred_rename_class)
+
 /* This target hook allows the backend to perform additional
    processing while initializing for variable expansion.  */
 DEFHOOK
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 5948e3f..ea94c87 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -1256,6 +1256,16 @@  default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED,
 #endif
 }
 
+reg_class_t
+default_preferred_rename_class (reg_class_t rclass)
+{
+#ifdef PREFERRED_RENAME_CLASS
+  return PREFERRED_RENAME_CLASS ((enum reg_class)rclass);
+#else
+  return rclass;
+#endif
+}
+
 /* The default implementation of TARGET_CLASS_LIKELY_SPILLED_P.  */
 
 bool
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index 7b640cc..ba3dd17 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -156,6 +156,7 @@  extern int default_register_move_cost (enum machine_mode, reg_class_t,
 extern bool default_profile_before_prologue (void);
 extern reg_class_t default_preferred_reload_class (rtx, reg_class_t);
 extern reg_class_t default_preferred_output_reload_class (rtx, reg_class_t);
+extern reg_class_t default_preferred_rename_class (reg_class_t rclass);
 extern bool default_class_likely_spilled_p (reg_class_t);
 
 extern enum unwind_info_type default_debug_unwind_info (void);