diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ira-conflicts.c | 17 |
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5053dd7..b41bb87 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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. + 2010-11-09 Paul Koning <ni1d@arrl.net> * config/pdp11/pdp11.md (lshrsi3, lshrhi3): Use add for diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index be79523..2891ab7 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 |