From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28140 invoked by alias); 19 Jun 2008 15:35:34 -0000 Received: (qmail 28128 invoked by uid 22791); 19 Jun 2008 15:35:32 -0000 X-Spam-Check-By: sourceware.org Received: from contrabass.post.ru (HELO contrabass.post.ru) (85.21.78.5) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 19 Jun 2008 15:35:04 +0000 Received: from corbina.ru (mail.post.ru [195.14.50.16]) by contrabass.post.ru (Postfix) with ESMTP id B9D598F2E1; Thu, 19 Jun 2008 19:35:00 +0400 (MSD) Received: from [10.193.100.241] (account aesok@post.ru HELO Vista) by corbina.ru (CommuniGate Pro SMTP 5.1.14) with ESMTPA id 725821411; Thu, 19 Jun 2008 19:35:00 +0400 Message-ID: From: "Anatoly Sokolov" To: "Ian Lance Taylor" Cc: , , , "Anatoliy Sokolov" , "Andy H" References: <113229086.20080618021412@post.ru> In-Reply-To: Subject: Re: Add more restriction in 'peep2_find_free_register' Date: Thu, 19 Jun 2008 15:36:00 -0000 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0319_01C8D243.9D9E53E0" X-Mailer: Microsoft Windows Mail 6.0.6001.18000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2008-06/txt/msg01276.txt.bz2 This is a multi-part message in MIME format. ------=_NextPart_000_0319_01C8D243.9D9E53E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: base64 Content-length: 1802 SGVsbG8uDQoNCklhbiBMYW5jZSBUYXlsb3Igd3JpdGVzOg0KPiBBbmF0b2x5 IFNva29sb3YgPGFlc29rQHBvc3QucnU+IHdyaXRlczoNCj4+DQo+PiAgICog Rm9yIGFuIGludGVycnVwdCBmdW5jdGlvbiBpdCBpcyBzYWZldHkgdG8gdXNl IG9ubHkgY2FsbC11c2VkIHJlZ2lzdGVycw0KPj4gICB3aGljaCBhcmUgc2F2 ZWQgaW4gcHJvbG9ndWUuIEluICdyZW5hbWVfcmVnaXN0ZXJzJyBvcHRpbWl6 YXRpb24gcGFzcyB0aGlzDQo+PiAgIGNoZWNrIGlzIGRvbmUgaW4gSEFSRF9S RUdOT19SRU5BTUVfT0sgbWFjcm8uIFRoaXMgcGF0Y2ggYWRkDQo+PiAgIEhB UkRfUkVHTk9fU0NSQVRDSF9PSyBtYWNybyBmb3IgJ3BlZXBob2xlMicgcGFz cy4gVGhlDQo+PiAgIEhBUkRfUkVHTk9fU0NSQVRDSF9PSyBtYWNybyBzb3Vs ZCBiZSBkaWZpbmVkIGZvciB0YXJnZXQgd2hpY2ggdXNlIGludGVycnVwdA0K Pj4gICBhbmQgJ21hdGNoX3NjcmF0Y2gnIGluIHBlZXBob2xlMiAoYXZyLCBt NjhrKS4NCj4gDQo+IFBsZWFzZSBtYWtlIGEgbmV3IHRhcmdldCBob29rIGlu c3RlYWQgKEkga25vdyB0aGF0IHRoZSBleGlzdGluZw0KPiBIQVJEX1JFR05P X1JFTkFNRV9PSyBpcyBzdGlsbCBhIG1hY3JvKS4gIFRoYW5rcy4NCg0KQW5k eSBIIHdyaXRlczoNCj4gVHlwbzoNCj4NCj5kZWZhdWx0X2hhcmRfcmVnbm9f c2NyYXRoX29rDQo+DQo+ZGVmYXVsdF9oYXJkX3JlZ25vX3NjcmF0Y2hfb2sN Cg0KVGhhbmtzIFlvdSwgQW5keS4NCg0KMjAwOC0wNi0xOSAgQW5hdG9seSBT b2tvbG92ICA8YWVzb2tAcG9zdC5ydT4NCg0KICAgICAgICAqIHRhcmdldC5o IChzdHJ1Y3QgZ2NjX3RhcmdldCk6IEFkZCBoYXJkX3JlZ25vX3NjcmF0Y2hf b2sgZmllbGQuDQogICAgICAgICogdGFyZ2V0LWRlZi5oIChUQVJHRVRfSEFS RF9SRUdOT19TQ1JBVENIX09LKTogTmV3Lg0KICAgICAgICAoVEFSR0VUX0lO SVRJQUxJWkVSKTogVXNlIFRBUkdFVF9IQVJEX1JFR05PX1NDUkFUQ0hfT0su DQogICAgICAgICogdGFyZ2hvb2tzLmMgKGRlZmF1bHRfaGFyZF9yZWdub19z Y3JhdGNoX29rKTogTmV3IGZ1bmN0aW9uLg0KICAgICAgICAqIHRhcmdob29r cy5oIChkZWZhdWx0X2hhcmRfcmVnbm9fc2NyYXRjaF9vayk6IERlY2xhcmUg ZnVuY3Rpb24uDQogICAgICAgICogZG9jL3RtLnRleGk6IERvY3VtZW50IFRB UkdFVF9IQVJEX1JFR05PX1NDUkFUQ0hfT0sgaG9vay4NCiAgICAgICAgKiBy ZWNvZy5jIChwZWVwMl9maW5kX2ZyZWVfcmVnaXN0ZXIpOiBBZGQgY2hlY2sg Zm9yIGdsb2JhbCByZWdzLiANCiAgICAgICAgIEFkZCB0YXJnZXQgc3BlY2lm aWMgY2hlY2suDQogDQpBbmF0b2x5Lg== ------=_NextPart_000_0319_01C8D243.9D9E53E0 Content-Type: text/plain; name="hard_regno_scratch_ok.diff.txt" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="hard_regno_scratch_ok.diff.txt" Content-length: 4731 Index: gcc/doc/tm.texi =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/doc/tm.texi (revision 136946) +++ gcc/doc/tm.texi (working copy) @@ -2242,6 +2242,16 @@ allocation. @end defmac =20 +@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=20 +@var{regno} as scratch reg in peephole2. + +One common use of this macro is to prevent using of a register that=20 +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/fr= om Index: gcc/targhooks.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/targhooks.c (revision 136946) +++ gcc/targhooks.c (working copy) @@ -703,4 +703,10 @@ return true; } =20 +bool=20 +default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED) +{ + return true; +} + #include "gt-targhooks.h" Index: gcc/targhooks.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/target.h (revision 136946) +++ gcc/target.h (working copy) @@ -866,6 +866,10 @@ but will be later. */ void (* instantiate_decls) (void); =20 + /* Return true if is OK to use a hard register REGNO as scratch register= =20 + 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 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 =3D=3D FRAME_POINTER_REGNUM || regno =3D=3D HARD_FRAME_PO= INTER_REGNUM) && (! reload_completed || frame_pointer_needed)) Index: gcc/target-def.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/target-def.h (revision 136946) +++ gcc/target-def.h (working copy) @@ -617,6 +617,10 @@ #define TARGET_INSTANTIATE_DECLS hook_void_void #endif =20 +#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, \ ------=_NextPart_000_0319_01C8D243.9D9E53E0--