aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-06-28 19:43:39 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-06-28 19:43:39 +0000
commite32e4c4a8826f872814b58deba660f6bb31e7b21 (patch)
tree936ccf1abdf76c32333fc7c2555b1fc82e89f93d
parentf161bfd3300fb19ae04a865806612e4f8e7847d7 (diff)
downloadgcc-e32e4c4a8826f872814b58deba660f6bb31e7b21.zip
gcc-e32e4c4a8826f872814b58deba660f6bb31e7b21.tar.gz
gcc-e32e4c4a8826f872814b58deba660f6bb31e7b21.tar.bz2
lra-constraints.c (need_for_split_p): Check call used hard regs living through calls.
2013-06-28 Vladimir Makarov <vmakarov@redhat.com> * lra-constraints.c (need_for_split_p): Check call used hard regs living through calls. From-SVN: r200553
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lra-constraints.c11
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c86c25..5aa5483 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-06-28 Vladimir Makarov <vmakarov@redhat.com>
+
+ * lra-constraints.c (need_for_split_p): Check call used hard regs
+ living through calls.
+
2013-06-28 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/57744
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 4ac20fd..f667512 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4201,6 +4201,15 @@ need_for_split_p (HARD_REG_SET potential_reload_hard_regs, int regno)
&& (regno >= FIRST_PSEUDO_REGISTER
|| ! TEST_HARD_REG_BIT (eliminable_regset, hard_regno))
&& ! TEST_HARD_REG_BIT (lra_no_alloc_regs, hard_regno)
+ /* Don't split call clobbered hard regs living through
+ calls, otherwise we might have a check problem in the
+ assign sub-pass as in the most cases (exception is a
+ situation when lra_risky_transformations_p value is
+ true) the assign pass assumes that all pseudos living
+ through calls are assigned to call saved hard regs. */
+ && (regno >= FIRST_PSEUDO_REGISTER
+ || ! TEST_HARD_REG_BIT (call_used_reg_set, regno)
+ || usage_insns[regno].calls_num == calls_num)
/* We need at least 2 reloads to make pseudo splitting
profitable. We should provide hard regno splitting in
any case to solve 1st insn scheduling problem when
@@ -4799,7 +4808,7 @@ inherit_in_ebb (rtx head, rtx tail)
usage_insns invalidation. */
if ((dst_regno < FIRST_PSEUDO_REGISTER
|| reg_renumber[dst_regno] >= 0)
- && ! reg->subreg_p && reg->type != OP_IN)
+ && ! reg->subreg_p && reg->type != OP_IN)
{
HARD_REG_SET s;