From 34bc30d7cdc9aecef6e7fbafe57d836f703ea07a Mon Sep 17 00:00:00 2001 From: vmakarov Date: Thu, 24 Sep 2015 20:40:30 +0000 Subject: [PATCH] 2015-09-24 Vladimir Makarov PR target/61578 * ira-color.c (update_allocno_cost): Add parameter. (update_costs_from_allocno): Decrease conflict cost. Pass the new parameter. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228097 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/ira-color.c | 25 ++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d0893001b8e..e951934a80b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-09-24 Vladimir Makarov + + PR target/61578 + * ira-color.c (update_allocno_cost): Add parameter. + (update_costs_from_allocno): Decrease conflict cost. Pass the new + parameter. + 2015-09-24 Manuel López-Ibáñez PR driver/67640 diff --git a/gcc/ira-color.c b/gcc/ira-color.c index e6533c6654d..a4820fb5149 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -1311,10 +1311,12 @@ get_next_update_cost (ira_allocno_t *allocno, ira_allocno_t *from, int *divisor) return true; } -/* Increase costs of HARD_REGNO by UPDATE_COST for ALLOCNO. Return - true if we really modified the cost. */ +/* Increase costs of HARD_REGNO by UPDATE_COST and conflict cost by + UPDATE_CONFLICT_COST for ALLOCNO. Return true if we really + modified the cost. */ static bool -update_allocno_cost (ira_allocno_t allocno, int hard_regno, int update_cost) +update_allocno_cost (ira_allocno_t allocno, int hard_regno, + int update_cost, int update_conflict_cost) { int i; enum reg_class aclass = ALLOCNO_CLASS (allocno); @@ -1330,7 +1332,7 @@ update_allocno_cost (ira_allocno_t allocno, int hard_regno, int update_cost) (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (allocno), aclass, 0, ALLOCNO_CONFLICT_HARD_REG_COSTS (allocno)); ALLOCNO_UPDATED_HARD_REG_COSTS (allocno)[i] += update_cost; - ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (allocno)[i] += update_cost; + ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (allocno)[i] += update_conflict_cost; return true; } @@ -1342,7 +1344,7 @@ static void update_costs_from_allocno (ira_allocno_t allocno, int hard_regno, int divisor, bool decr_p, bool record_p) { - int cost, update_cost; + int cost, update_cost, update_conflict_cost; machine_mode mode; enum reg_class rclass, aclass; ira_allocno_t another_allocno, from = NULL; @@ -1383,11 +1385,20 @@ update_costs_from_allocno (ira_allocno_t allocno, int hard_regno, if (decr_p) cost = -cost; - update_cost = cp->freq * cost / divisor; + update_conflict_cost = update_cost = cp->freq * cost / divisor; + + if (ALLOCNO_COLOR_DATA (another_allocno) != NULL + && (ALLOCNO_COLOR_DATA (allocno)->first_thread_allocno + != ALLOCNO_COLOR_DATA (another_allocno)->first_thread_allocno)) + /* Decrease conflict cost of ANOTHER_ALLOCNO if it is not + in the same allocation thread. */ + update_conflict_cost /= COST_HOP_DIVISOR; + if (update_cost == 0) continue; - if (! update_allocno_cost (another_allocno, hard_regno, update_cost)) + if (! update_allocno_cost (another_allocno, hard_regno, + update_cost, update_conflict_cost)) continue; queue_update_cost (another_allocno, allocno, divisor * COST_HOP_DIVISOR); if (record_p && ALLOCNO_COLOR_DATA (another_allocno) != NULL) -- 2.11.4.GIT