From: "Anatoly Sokolov" <aesok@post.ru>
To: "Ian Lance Taylor" <iant@google.com>
Cc: <gcc-patches@gcc.gnu.org>, <rth@redhat.com>,
<chertykov@gmail.com>, "Anatoliy Sokolov" <aesok@post.ru>,
"Andy H" <hutchinsonandy@aim.com>
Subject: Re: Add more restriction in 'peep2_find_free_register'
Date: Thu, 19 Jun 2008 15:36:00 -0000 [thread overview]
Message-ID: <EA53E23276F34EEEBE5A233BC7DC9364@Vista> (raw)
In-Reply-To: <m3r6au245m.fsf@google.com>
[-- Attachment #1: Type: text/plain, Size: 1327 bytes --]
Hello.
Ian Lance Taylor writes:
> Anatoly Sokolov <aesok@post.ru> writes:
>>
>> * 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.
Andy H writes:
> Typo:
>
>default_hard_regno_scrath_ok
>
>default_hard_regno_scratch_ok
Thanks You, Andy.
2008-06-19 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 (peep2_find_free_register): Add check for global regs.
Add target specific check.
Anatoly.
[-- Attachment #2: hard_regno_scratch_ok.diff.txt --]
[-- Type: text/plain, Size: 3987 bytes --]
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi (revision 136946)
+++ 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 136946)
+++ gcc/targhooks.c (working copy)
@@ -703,4 +703,10 @@
return true;
}
+bool
+default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
+{
+ return true;
+}
+
#include "gt-targhooks.h"
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h (revision 136946)
+++ gcc/targhooks.h (working copy)
@@ -97,3 +97,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_scratch_ok (unsigned int);
Index: gcc/target.h
===================================================================
--- gcc/target.h (revision 136946)
+++ gcc/target.h (working copy)
@@ -866,6 +866,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_scratch_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 136946)
+++ 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_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: gcc/target-def.h
===================================================================
--- gcc/target-def.h (revision 136946)
+++ gcc/target-def.h (working copy)
@@ -617,6 +617,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
@@ -842,6 +846,7 @@
TARGET_SECONDARY_RELOAD, \
TARGET_EXPAND_TO_RTL_HOOK, \
TARGET_INSTANTIATE_DECLS, \
+ TARGET_HARD_REGNO_SCRATCH_OK, \
TARGET_C, \
TARGET_CXX, \
TARGET_EMUTLS, \
next prev parent reply other threads:[~2008-06-19 15:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-17 22:26 Anatoly Sokolov
2008-06-18 14:47 ` Ian Lance Taylor
2008-06-19 15:36 ` Anatoly Sokolov [this message]
2008-06-30 21:02 ` Ian Lance Taylor
2008-06-18 22:10 Anatoly Sokolov
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=EA53E23276F34EEEBE5A233BC7DC9364@Vista \
--to=aesok@post.ru \
--cc=chertykov@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hutchinsonandy@aim.com \
--cc=iant@google.com \
--cc=rth@redhat.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).