From 8d189b3fd1bc58ffd0270a336212c960e1fb1e1e Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Fri, 8 Apr 2011 17:17:50 +0000 Subject: [PATCH] re PR libstdc++/4435 (Object file has undefined basic_string symbol as local.) 2011-04-08 Vladimir Makarov PR 4435 * ira-color.c (setup_profitable_hard_regs): Add comments. Don't take prohibited hard regs into account. (setup_conflict_profitable_regs): Rename to get_conflict_profitable_regs. (check_hard_reg_p): Check prohibited hard regs. From-SVN: r172201 --- gcc/ChangeLog | 9 +++++++++ gcc/ira-color.c | 33 +++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d19aa6810e1..3e67ab8785b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-04-08 Vladimir Makarov + + PR 4435 + * ira-color.c (setup_profitable_hard_regs): Add comments. + Don't take prohibited hard regs into account. + (setup_conflict_profitable_regs): Rename to + get_conflict_profitable_regs. + (check_hard_reg_p): Check prohibited hard regs. + 2011-04-08 Nathan Froyd * config/alpha/alpha.c (alpha_emit_xfloating_libcall): Call use_reg. diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 8fa3393b367..7a1073b0bf2 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -1057,6 +1057,8 @@ setup_profitable_hard_regs (void) enum reg_class aclass; enum machine_mode mode; + /* Initial set up from allocno classes and explicitly conflicting + hard regs. */ EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi) { a = ira_allocnos[i]; @@ -1076,9 +1078,6 @@ setup_profitable_hard_regs (void) { COPY_HARD_REG_SET (obj_data->profitable_hard_regs, reg_class_contents[aclass]); - AND_COMPL_HARD_REG_SET - (obj_data->profitable_hard_regs, - ira_prohibited_class_mode_regs[aclass][mode]); AND_COMPL_HARD_REG_SET (obj_data->profitable_hard_regs, ira_no_alloc_regs); AND_COMPL_HARD_REG_SET (obj_data->profitable_hard_regs, @@ -1086,6 +1085,7 @@ setup_profitable_hard_regs (void) } } } + /* Exclude hard regs already assigned for conflicting objects. */ EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, i, bi) { a = ira_allocnos[i]; @@ -1124,6 +1124,7 @@ setup_profitable_hard_regs (void) } } } + /* Exclude too costly hard regs. */ EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi) { int min_cost = INT_MAX; @@ -1451,9 +1452,9 @@ update_conflict_hard_regno_costs (int *costs, enum reg_class aclass, profitable regs exclude hard regs which can not hold value of mode of allocno A. */ static inline void -setup_conflict_profitable_regs (ira_allocno_t a, bool retry_p, - HARD_REG_SET *conflict_regs, - HARD_REG_SET *profitable_regs) +get_conflict_profitable_regs (ira_allocno_t a, bool retry_p, + HARD_REG_SET *conflict_regs, + HARD_REG_SET *profitable_regs) { int i, nwords; ira_object_t obj; @@ -1485,8 +1486,15 @@ check_hard_reg_p (ira_allocno_t a, int hard_regno, HARD_REG_SET *conflict_regs, HARD_REG_SET *profitable_regs) { int j, nwords, nregs; + enum reg_class aclass; + enum machine_mode mode; - nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)]; + aclass = ALLOCNO_CLASS (a); + mode = ALLOCNO_MODE (a); + if (TEST_HARD_REG_BIT (ira_prohibited_class_mode_regs[aclass][mode], + hard_regno)) + return false; + nregs = hard_regno_nregs[hard_regno][mode]; nwords = ALLOCNO_NUM_OBJECTS (a); for (j = 0; j < nregs; j++) { @@ -1554,8 +1562,8 @@ assign_hard_reg (ira_allocno_t a, bool retry_p) #endif ira_assert (! ALLOCNO_ASSIGNED_P (a)); - setup_conflict_profitable_regs (a, retry_p, - conflicting_regs, profitable_hard_regs); + get_conflict_profitable_regs (a, retry_p, + conflicting_regs, profitable_hard_regs); aclass = ALLOCNO_CLASS (a); class_size = ira_class_hard_regs_num[aclass]; best_hard_regno = -1; @@ -2233,7 +2241,8 @@ setup_allocno_available_regs_num (ira_allocno_t a) ira_object_t obj = ALLOCNO_OBJECT (a, k); object_color_data_t obj_data = OBJECT_COLOR_DATA (obj); - /* Checking only profitable hard regs. */ + /* Checking only profitable hard regs which exclude + object's conflict hard regs. */ if (TEST_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), hard_regno + j) || ! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs, @@ -2403,8 +2412,8 @@ improve_allocation (void) else base_cost = allocno_costs[ira_class_hard_reg_index[aclass][hregno]]; try_p = false; - setup_conflict_profitable_regs (a, false, - conflicting_regs, profitable_hard_regs); + get_conflict_profitable_regs (a, false, + conflicting_regs, profitable_hard_regs); class_size = ira_class_hard_regs_num[aclass]; /* Set up cost improvement for usage of each profitable hard register for allocno A. */ -- 2.30.2