summaryrefslogtreecommitdiff
path: root/gcc/ira-conflicts.c
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2010-11-09 15:52:24 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2010-11-09 15:52:24 +0000
commit0644953e64a91b24e2504900aa70e394c28ffc51 (patch)
treebffa6dc672936060688706b9f3357da538033e9e /gcc/ira-conflicts.c
parentde084f55c6b2e2908401f520858a58e4ad8268fc (diff)
downloadgcc-0644953e64a91b24e2504900aa70e394c28ffc51.tar.gz
re PR rtl-optimization/46237 (SPECint2006 403.gcc fails with -mzarch -m31)
2010-11-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> PR rtl-optimization/46237 * ira-conflicts.c (ira_build_conflicts): Record conflicts for call saved hard regs if they might get partially clobbered. From-SVN: r166495
Diffstat (limited to 'gcc/ira-conflicts.c')
-rw-r--r--gcc/ira-conflicts.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c
index be79523359b..2891ab78867 100644
--- a/gcc/ira-conflicts.c
+++ b/gcc/ira-conflicts.c
@@ -908,6 +908,23 @@ ira_build_conflicts (void)
IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
temp_hard_reg_set);
}
+
+ if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
+ {
+ int regno;
+
+ /* Allocnos bigger than the saved part of call saved
+ regs must conflict with them. */
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!TEST_HARD_REG_BIT (call_used_reg_set, regno)
+ && HARD_REGNO_CALL_PART_CLOBBERED (regno,
+ obj->allocno->mode))
+ {
+ SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
+ SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ regno);
+ }
+ }
}
}
if (optimize && ira_conflicts_p