diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2010-11-09 15:52:24 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2010-11-09 15:52:24 +0000 |
commit | 0644953e64a91b24e2504900aa70e394c28ffc51 (patch) | |
tree | bffa6dc672936060688706b9f3357da538033e9e /gcc/ira-conflicts.c | |
parent | de084f55c6b2e2908401f520858a58e4ad8268fc (diff) | |
download | gcc-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.c | 17 |
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 |