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.
next 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).