aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2014-05-30 08:43:05 +0000
committerTom de Vries <vries@gcc.gnu.org>2014-05-30 08:43:05 +0000
commit10e1bdb2723bfd322516ebf76432b6f927a478e2 (patch)
treebf5a31454d3701aa688b9681b11ee36cdfa0438f /gcc
parent569120372d8b1c3cd1e0b867c686e250872f760e (diff)
downloadgcc-10e1bdb2723bfd322516ebf76432b6f927a478e2.zip
gcc-10e1bdb2723bfd322516ebf76432b6f927a478e2.tar.gz
gcc-10e1bdb2723bfd322516ebf76432b6f927a478e2.tar.bz2
-fuse-caller-save - Support in lra
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. From-SVN: r211074
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/lra-assigns.c13
-rw-r--r--gcc/lra-constraints.c5
-rw-r--r--gcc/lra-int.h4
-rw-r--r--gcc/lra-lives.c11
-rw-r--r--gcc/lra.c14
6 files changed, 52 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e9046bc..4dc8b7a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+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.
+
2014-05-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/thumb2.md (*thumb2_movhi_insn): Set type of movw
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, &reg_obstack);
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 69ffdcd..147f121 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4622,7 +4622,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. */