public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Anatoly Sokolov <aesok@post.ru>
To: Ian Lance Taylor <iant@google.com>
Cc: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>,
	 	rth@redhat.com <rth@redhat.com>,
	chertykov@gmail.com <chertykov@gmail.com>,  	<aesok@post.ru>
Subject: Re: Add more restriction in 'peep2_find_free_register'
Date: Wed, 18 Jun 2008 22:10:00 -0000	[thread overview]
Message-ID: <474011943.20080619014643@post.ru> (raw)

Hello.

Ian Lance Taylor  writes:

> Anatoly Sokolov <aesok@post.ru> writes:
> 
>> This patch add two more check in 'peep2_find_free_register' function, which
>> find free hard registers for use as scratch registers in peephole2.
>>
>>   * It is not allowed to use register that are being declared as global, as
>>   scratch register.
>>
>>   * For an interrupt function it is safety to use only call-used registers
>>   which are saved in prologue. In 'rename_registers' optimization pass this
>>   check is done in HARD_REGNO_RENAME_OK macro. This patch add
>>   HARD_REGNO_SCRATCH_OK macro for 'peephole2' pass. The
>>   HARD_REGNO_SCRATCH_OK macro sould be difined for target which use interrupt
>>   and 'match_scratch' in peephole2 (avr, m68k).
> 
> Please make a new target hook instead (I know that the existing
> HARD_REGNO_RENAME_OK is still a macro).  Thanks.
> 

2008-06-18  Anatoly Sokolov <aesok@post.ru>

        * target.h (struct gcc_target): Add hard_regno_scrath_ok field.
        * target-def.h (TARGET_HARD_REGNO_SCRATCH_OK): New.
        (TARGET_INITIALIZER): Use TARGET_HARD_REGNO_SCRATCH_OK.
        * targhooks.c (default_hard_regno_scrath_ok): New function.
        * targhooks.h (default_hard_regno_scrath_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.


Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi     (revision 136911)
+++ gcc/doc/tm.texi     (working copy)
@@ -2242,6 +2242,16 @@
 allocation.
 @end defmac
 
+@deftypefn {Target Hook} bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int @var{regno})
+This target hook should return '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.
+
+TThe default version of this hook always returns '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: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c     (revision 136911)
+++ gcc/targhooks.c     (working copy)
@@ -697,4 +697,10 @@
   return true;
 }
 
+bool 
+default_hard_regno_scrath_ok (unsigned int regno ATTRIBUTE_UNUSED)
+{
+  return true;
+}
+
 #include "gt-targhooks.h"
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h     (revision 136911)
+++ gcc/targhooks.h     (working copy)
@@ -96,3 +96,5 @@
 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_scrath_ok (unsigned int);
Index: gcc/target.h
===================================================================
--- gcc/target.h        (revision 136911)
+++ gcc/target.h        (working copy)
@@ -863,6 +863,10 @@
      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_scrath_ok) (unsigned int regno);
+
   /* Functions specific to the C family of frontends.  */
   struct c {
     /* Return machine mode for non-standard suffix
Index: gcc/recog.c
===================================================================
--- gcc/recog.c	(revision 136911)
+++ gcc/recog.c	(working copy)
@@ -40,6 +40,7 @@
 #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 @@
       /* 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 @@
       /* 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_scrath_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: gcc/target-def.h
===================================================================
--- gcc/target-def.h    (revision 136911)
+++ gcc/target-def.h    (working copy)
@@ -614,6 +614,10 @@
 #define TARGET_INSTANTIATE_DECLS hook_void_void
 #endif
 
+#ifndef TARGET_HARD_REGNO_SCRATCH_OK
+#define TARGET_HARD_REGNO_SCRATCH_OK default_hard_regno_scrath_ok
+#endif
+
 /* C specific.  */
 #ifndef TARGET_C_MODE_FOR_SUFFIX
 #define TARGET_C_MODE_FOR_SUFFIX default_mode_for_suffix
@@ -838,6 +842,7 @@
   TARGET_SECONDARY_RELOAD,                     \
   TARGET_EXPAND_TO_RTL_HOOK,                   \
   TARGET_INSTANTIATE_DECLS,                    \
+  TARGET_HARD_REGNO_SCRATCH_OK,                        \
   TARGET_C,                                    \
   TARGET_CXX,                                  \
   TARGET_EMUTLS,                               \


Anatoly.




             reply	other threads:[~2008-06-18 21:46 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-18 22:10 Anatoly Sokolov [this message]
  -- strict thread matches above, loose matches on Subject: below --
2008-06-17 22:26 Anatoly Sokolov
2008-06-18 14:47 ` Ian Lance Taylor
2008-06-19 15:36   ` Anatoly Sokolov
2008-06-30 21:02     ` Ian Lance Taylor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=474011943.20080619014643@post.ru \
    --to=aesok@post.ru \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=iant@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).