From: Tom de Vries <Tom_deVries@mentor.com>
To: Vladimir Makarov <vmakarov@redhat.com>
Cc: <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH][IRA] Analysis of register usage of functions for usage by IRA.
Date: Fri, 30 May 2014 09:20:00 -0000 [thread overview]
Message-ID: <53884D61.3000402@mentor.com> (raw)
In-Reply-To: <52D591AA.4060103@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 1482 bytes --]
On 14-01-14 20:36, Vladimir Makarov wrote:
>>> Unfortunately I haven't been able to find time to work further on the
>>> >>LRA part.
>>> >>So if you're still willing to pick up that part, that would be great.
>> >
>> >Vladimir,
>> >
>> >I gave this a try. The attached patch works for the included test-case
>> >for x86_64.
>> >
>> >I've bootstrapped and reg-tested the patch (in combination with the
>> >other patches from the series) on x86_64.
>> >
>> >OK for stage1?
>> >
> Yes, it is ok for stage1. Thanks for not forgetting LRA and sorry for
> the delay with the answer (it is not a high priority patch for me right
> now).
>
> I believe, this patch helps to improve code also because of better
> spilling into SSE regs. Spilling into SSE regs instead of memory has a
> rare probability right now as all SSE regs are call clobbered.
>
Vladimir,
After committing the original patch, Martin Liška told me on IRC that the patch
broke the build with --enable-checking=release.
The bit in lra_assign used the call_p field unconditionally, while the
definition of the call_p field is guarded with #ifdef ENABLE_CHECKING.
I've reverted the original patch, and bootstrapped and reg-tested this version
of the patch, which has a simplified bit for lra_assign.
The only functional difference between the patches is that we no longer add
printing a debug message in lra_assign. Committed (since the difference between
the approved and new patch is trivial).
Thanks,
- Tom
[-- Attachment #2: 0001-fuse-caller-save-Support-in-lra.patch --]
[-- Type: text/x-patch, Size: 4851 bytes --]
2014-05-30 Tom de Vries <tom@codesourcery.com>
* lra-int.h (struct lra_reg): Add field actual_call_used_reg_set.
* lra.c (initialize_lra_reg_info_element): Add init of
actual_call_used_reg_set field.
(lra): Call lra_create_live_ranges before lra_inheritance for
-fuse-caller-save.
* lra-assigns.c (lra_assign): Allow call_used_regs to cross calls for
-fuse-caller-save.
* lra-constraints.c (need_for_call_save_p): Use actual_call_used_reg_set
instead of call_used_reg_set for -fuse-caller-save.
* lra-lives.c (process_bb_lives): Calculate actual_call_used_reg_set.
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c
index f7bb86b..03c2506 100644
--- a/gcc/lra-assigns.c
+++ b/gcc/lra-assigns.c
@@ -1460,12 +1460,13 @@ lra_assign (void)
create_live_range_start_chains ();
setup_live_pseudos_and_spill_after_risky_transforms (&all_spilled_pseudos);
#ifdef ENABLE_CHECKING
- for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
- if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0
- && lra_reg_info[i].call_p
- && overlaps_hard_reg_set_p (call_used_reg_set,
- PSEUDO_REGNO_MODE (i), reg_renumber[i]))
- gcc_unreachable ();
+ if (!flag_use_caller_save)
+ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
+ if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0
+ && lra_reg_info[i].call_p
+ && overlaps_hard_reg_set_p (call_used_reg_set,
+ PSEUDO_REGNO_MODE (i), reg_renumber[i]))
+ gcc_unreachable ();
#endif
/* Setup insns to process on the next constraint pass. */
bitmap_initialize (&changed_pseudo_bitmap, ®_obstack);
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 2df841a..7eb9dbc 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4605,7 +4605,10 @@ need_for_call_save_p (int regno)
lra_assert (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] >= 0);
return (usage_insns[regno].calls_num < calls_num
&& (overlaps_hard_reg_set_p
- (call_used_reg_set,
+ ((flag_use_caller_save &&
+ ! hard_reg_set_empty_p (lra_reg_info[regno].actual_call_used_reg_set))
+ ? lra_reg_info[regno].actual_call_used_reg_set
+ : call_used_reg_set,
PSEUDO_REGNO_MODE (regno), reg_renumber[regno])
|| HARD_REGNO_CALL_PART_CLOBBERED (reg_renumber[regno],
PSEUDO_REGNO_MODE (regno))));
diff --git a/gcc/lra-int.h b/gcc/lra-int.h
index 41c9849..3c89734 100644
--- a/gcc/lra-int.h
+++ b/gcc/lra-int.h
@@ -77,6 +77,10 @@ struct lra_reg
/* The following fields are defined only for pseudos. */
/* Hard registers with which the pseudo conflicts. */
HARD_REG_SET conflict_hard_regs;
+ /* Call used registers with which the pseudo conflicts, taking into account
+ the registers used by functions called from calls which cross the
+ pseudo. */
+ HARD_REG_SET actual_call_used_reg_set;
/* We assign hard registers to reload pseudos which can occur in few
places. So two hard register preferences are enough for them.
The following fields define the preferred hard registers. If
diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c
index 8444ade..26ba0d2 100644
--- a/gcc/lra-lives.c
+++ b/gcc/lra-lives.c
@@ -624,6 +624,17 @@ process_bb_lives (basic_block bb, int &curr_point)
if (call_p)
{
+ if (flag_use_caller_save)
+ {
+ HARD_REG_SET this_call_used_reg_set;
+ get_call_reg_set_usage (curr_insn, &this_call_used_reg_set,
+ call_used_reg_set);
+
+ EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
+ IOR_HARD_REG_SET (lra_reg_info[j].actual_call_used_reg_set,
+ this_call_used_reg_set);
+ }
+
sparseset_ior (pseudos_live_through_calls,
pseudos_live_through_calls, pseudos_live);
if (cfun->has_nonlocal_label
diff --git a/gcc/lra.c b/gcc/lra.c
index ecec890..d199a81 100644
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -1427,6 +1427,7 @@ initialize_lra_reg_info_element (int i)
lra_reg_info[i].no_stack_p = false;
#endif
CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
+ CLEAR_HARD_REG_SET (lra_reg_info[i].actual_call_used_reg_set);
lra_reg_info[i].preferred_hard_regno1 = -1;
lra_reg_info[i].preferred_hard_regno2 = -1;
lra_reg_info[i].preferred_hard_regno_profit1 = 0;
@@ -2344,7 +2345,18 @@ lra (FILE *f)
lra_eliminate (false, false);
/* Do inheritance only for regular algorithms. */
if (! lra_simple_p)
- lra_inheritance ();
+ {
+ if (flag_use_caller_save)
+ {
+ if (live_p)
+ lra_clear_live_ranges ();
+ /* As a side-effect of lra_create_live_ranges, we calculate
+ actual_call_used_reg_set, which is needed during
+ lra_inheritance. */
+ lra_create_live_ranges (true);
+ }
+ lra_inheritance ();
+ }
if (live_p)
lra_clear_live_ranges ();
/* We need live ranges for lra_assign -- so build them. */
--
1.9.1
next prev parent reply other threads:[~2014-05-30 9:20 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-25 13:05 Tom de Vries
2013-01-25 15:46 ` Vladimir Makarov
2013-02-07 19:12 ` Tom de Vries
2013-02-13 22:35 ` Vladimir Makarov
2013-03-14 9:35 ` Tom de Vries
2013-03-14 15:22 ` Vladimir Makarov
2013-03-29 12:54 ` Tom de Vries
2013-03-29 13:06 ` [PATCH][07/10] -fuse-caller-save - Use collected register usage information Tom de Vries
2013-03-29 13:06 ` [PATCH][10/10] -fuse-caller-save - Add test-case Tom de Vries
2013-03-29 13:06 ` [PATCH][03/10] -fuse-caller-save - Add implicit parameter to find_all_hard_reg_sets Tom de Vries
2013-03-29 13:06 ` [PATCH][08/10] -fuse-caller-save - Enable by default at O2 and higher Tom de Vries
2013-03-29 13:06 ` [PATCH][04/10] -fuse-caller-save - Add TARGET_FN_OTHER_HARD_REG_USAGE hook Tom de Vries
2013-03-29 13:06 ` [PATCH][05/10] -fuse-caller-save - Implement TARGET_FN_OTHER_HARD_REG_USAGE hook for ARM Tom de Vries
2013-03-29 13:06 ` [PATCH][01/10] -fuse-caller-save - Add command line option Tom de Vries
2013-03-29 13:06 ` [PATCH][02/10] -fuse-caller-save - Add new reg-note REG_CALL_DECL Tom de Vries
2013-03-29 13:06 ` [PATCH][09/10] -fuse-caller-save - Add documentation Tom de Vries
2013-03-29 13:06 ` [PATCH][06/10] -fuse-caller-save - Collect register usage information Tom de Vries
2013-03-30 16:10 ` [PATCH][IRA] Analysis of register usage of functions for usage by IRA Tom de Vries
2014-01-09 14:42 ` Richard Earnshaw
2014-01-09 20:56 ` Tom de Vries
2014-01-09 21:10 ` Andi Kleen
2014-01-10 0:22 ` Tom de Vries
2014-01-10 11:39 ` Richard Earnshaw
2014-01-10 16:44 ` Tom de Vries
2014-01-13 16:16 ` Tom de Vries
2014-01-14 10:00 ` Richard Earnshaw
2013-03-30 17:11 ` [PATCH][03/10] -fuse-caller-save - Add implicit parameter to find_all_hard_reg_sets Tom de Vries
2013-03-30 17:11 ` [PATCH][04/10] -fuse-caller-save - Add TARGET_FN_OTHER_HARD_REG_USAGE hook Tom de Vries
2013-12-07 15:07 ` [PATCH] -fuse-caller-save - Implement TARGET_FN_OTHER_HARD_REG_USAGE hook for MIPS Tom de Vries
2013-12-25 13:02 ` Tom de Vries
2014-01-09 13:51 ` [PING^2][PATCH] " Tom de Vries
2014-01-09 15:31 ` Richard Sandiford
2014-01-09 23:43 ` Tom de Vries
2014-01-10 8:47 ` Richard Sandiford
2014-01-13 15:04 ` Tom de Vries
2013-03-30 17:11 ` [PATCH][01/10] -fuse-caller-save - Add command line option Tom de Vries
2013-03-30 17:11 ` [PATCH][06/10] -fuse-caller-save - Collect register usage information Tom de Vries
2013-03-30 17:11 ` [PATCH][02/10] -fuse-caller-save - Add new reg-note REG_CALL_DECL Tom de Vries
2013-03-30 17:11 ` [PATCH][05/10] -fuse-caller-save - Implement TARGET_FN_OTHER_HARD_REG_USAGE hook for ARM Tom de Vries
2013-12-06 0:54 ` Tom de Vries
2013-12-09 10:03 ` Richard Earnshaw
2013-03-30 17:12 ` [PATCH][08/10] -fuse-caller-save - Enable by default at O2 and higher Tom de Vries
2013-03-30 17:12 ` [PATCH][09/10] -fuse-caller-save - Add documentation Tom de Vries
2013-03-30 17:12 ` [PATCH][10/10] -fuse-caller-save - Add test-case Tom de Vries
2013-04-28 10:57 ` Richard Sandiford
2013-12-06 0:34 ` Tom de Vries
2013-12-06 8:51 ` Richard Sandiford
2013-03-30 17:12 ` [PATCH][07/10] -fuse-caller-save - Use collected register usage information Tom de Vries
2013-12-06 0:56 ` Tom de Vries
2013-12-06 9:11 ` Paolo Bonzini
2013-12-06 0:47 ` [PATCH][IRA] Analysis of register usage of functions for usage by IRA Tom de Vries
2014-01-14 19:36 ` Vladimir Makarov
2014-05-30 9:20 ` Tom de Vries [this message]
2014-09-01 16:41 ` Ulrich Weigand
2014-09-03 16:58 ` Tom de Vries
2014-09-03 18:12 ` Ulrich Weigand
2014-09-03 22:24 ` Tom de Vries
2014-09-04 7:37 ` Tom de Vries
2014-09-04 14:55 ` Vladimir Makarov
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=53884D61.3000402@mentor.com \
--to=tom_devries@mentor.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=vmakarov@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).