From: krebbel Date: Tue, 9 Nov 2010 15:52:24 +0000 (+0000) Subject: 2010-11-09 Andreas Krebbel X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b71fb7f752aba13d14601d2c29d234c840aa402;p=thirdparty%2Fgcc.git 2010-11-09 Andreas Krebbel PR rtl-optimization/46237 * ira-conflicts.c (ira_build_conflicts): Record conflicts for call saved hard regs if they might get partially clobbered. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166495 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5053dd7820f7..b41bb8746594 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-09 Andreas Krebbel + + 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 * config/pdp11/pdp11.md (lshrsi3, lshrhi3): Use add for diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index be79523359b4..2891ab788675 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