diff --git a/0199-Backport-Improve-hard-reg-preference-propapagation.patch b/0199-Backport-Improve-hard-reg-preference-propapagation.patch new file mode 100644 index 0000000000000000000000000000000000000000..aa71cf46294f32adfb5c53354bd284c20fffeb1e --- /dev/null +++ b/0199-Backport-Improve-hard-reg-preference-propapagation.patch @@ -0,0 +1,204 @@ +From a145d61f5ed0aba1aa0a4adc47afcedf8eaf7579 Mon Sep 17 00:00:00 2001 +From: "Vladimir N. Makarov" +Date: Fri, 8 May 2020 16:51:40 -0400 +Subject: [PATCH] [Backport] Improve hard reg preference propapagation. + +Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=74dc179a6da33cd00f6d4a93fbb97dc84f610126 + +2020-05-08 Vladimir Makarov + + * ira-color.c (update_costs_from_allocno): Remove + conflict_cost_update_p argument. Propagate costs only along + threads. Always do conflict cost update. Add printing debugging + info. + (update_costs_from_copies): Add printing debugging info. + (restore_costs_from_copies): Ditto. + (assign_hard_reg): Improve debug info. + (push_only_colorable): Ditto. Call update_costs_from_prefs. + (color_allocnos): Remove update_costs_from_prefs. + +2020-05-08 Vladimir Makarov + + * gcc.target/i386/pr92807-1.c: Improve the regex. +--- + gcc/ira-color.c | 63 +++++++++++++++-------- + gcc/testsuite/gcc.target/i386/pr92807-1.c | 2 +- + 2 files changed, 42 insertions(+), 23 deletions(-) + +diff --git a/gcc/ira-color.c b/gcc/ira-color.c +index b0fc159a8..536ae8da2 100644 +--- a/gcc/ira-color.c ++++ b/gcc/ira-color.c +@@ -1356,13 +1356,11 @@ allocnos_conflict_p (ira_allocno_t a1, ira_allocno_t a2) + + /* Update (decrease if DECR_P) HARD_REGNO cost of allocnos connected + by copies to ALLOCNO to increase chances to remove some copies as +- the result of subsequent assignment. Update conflict costs only +- for true CONFLICT_COST_UPDATE_P. Record cost updates if RECORD_P is +- true. */ ++ the result of subsequent assignment. Update conflict costs. ++ Record cost updates if RECORD_P is true. */ + static void + update_costs_from_allocno (ira_allocno_t allocno, int hard_regno, +- int divisor, bool decr_p, bool record_p, +- bool conflict_cost_update_p) ++ int divisor, bool decr_p, bool record_p) + { + int cost, update_cost, update_conflict_cost; + machine_mode mode; +@@ -1391,7 +1389,9 @@ update_costs_from_allocno (ira_allocno_t allocno, int hard_regno, + gcc_unreachable (); + + if (another_allocno == from +- || allocnos_conflict_p (another_allocno, start)) ++ || (ALLOCNO_COLOR_DATA (another_allocno) != NULL ++ && (ALLOCNO_COLOR_DATA (allocno)->first_thread_allocno ++ != ALLOCNO_COLOR_DATA (another_allocno)->first_thread_allocno))) + continue; + + aclass = ALLOCNO_CLASS (another_allocno); +@@ -1419,15 +1419,13 @@ update_costs_from_allocno (ira_allocno_t allocno, int hard_regno, + cost = -cost; + + update_cost = cp->freq * cost / divisor; +- update_conflict_cost = conflict_cost_update_p ? update_cost : 0; +- +- 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; ++ update_conflict_cost = update_cost; + ++ if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, ++ " a%dr%d (hr%d): update cost by %d, conflict cost by %d\n", ++ ALLOCNO_NUM (another_allocno), ALLOCNO_REGNO (another_allocno), ++ hard_regno, update_cost, update_conflict_cost); + if (update_cost == 0) + continue; + +@@ -1455,8 +1453,13 @@ update_costs_from_prefs (ira_allocno_t allocno) + + start_update_cost (); + for (pref = ALLOCNO_PREFS (allocno); pref != NULL; pref = pref->next_pref) +- update_costs_from_allocno (allocno, pref->hard_regno, +- COST_HOP_DIVISOR, true, true, false); ++ { ++ if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, " Start updating from pref of hr%d for a%dr%d:\n", ++ pref->hard_regno, ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno)); ++ update_costs_from_allocno (allocno, pref->hard_regno, ++ COST_HOP_DIVISOR, true, true); ++ } + } + + /* Update (decrease if DECR_P) the cost of allocnos connected to +@@ -1471,7 +1474,10 @@ update_costs_from_copies (ira_allocno_t allocno, bool decr_p, bool record_p) + hard_regno = ALLOCNO_HARD_REGNO (allocno); + ira_assert (hard_regno >= 0 && ALLOCNO_CLASS (allocno) != NO_REGS); + start_update_cost (); +- update_costs_from_allocno (allocno, hard_regno, 1, decr_p, record_p, true); ++ if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, " Start updating from a%dr%d by copies:\n", ++ ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno)); ++ update_costs_from_allocno (allocno, hard_regno, 1, decr_p, record_p); + } + + /* Update conflict_allocno_hard_prefs of allocnos conflicting with +@@ -1519,9 +1525,12 @@ restore_costs_from_copies (ira_allocno_t allocno) + return; + records = ALLOCNO_COLOR_DATA (allocno)->update_cost_records; + start_update_cost (); ++ if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, " Start restoring from a%dr%d:\n", ++ ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno)); + for (curr = records; curr != NULL; curr = curr->next) + update_costs_from_allocno (allocno, curr->hard_regno, +- curr->divisor, true, false, true); ++ curr->divisor, true, false); + free_update_cost_record_list (records); + ALLOCNO_COLOR_DATA (allocno)->update_cost_records = NULL; + } +@@ -1936,6 +1945,8 @@ assign_hard_reg (ira_allocno_t a, bool retry_p) + if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) + fprintf (ira_dump_file, "(%d=%d,%d) ", hard_regno, cost, full_cost); + } ++ if (internal_flag_ira_verbose > 5 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, "\n"); + if (min_full_cost > mem_cost + /* Do not spill static chain pointer pseudo when non-local goto + is used. */ +@@ -2114,7 +2125,7 @@ form_threads_from_copies (int cp_num) + if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL) + fprintf + (ira_dump_file, +- " Forming thread by copy %d:a%dr%d-a%dr%d (freq=%d):\n", ++ " Forming thread by copy %d:a%dr%d-a%dr%d (freq=%d):\n", + cp->num, ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first), + ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), + cp->freq); +@@ -2122,7 +2133,7 @@ form_threads_from_copies (int cp_num) + if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL) + { + thread1 = ALLOCNO_COLOR_DATA (thread1)->first_thread_allocno; +- fprintf (ira_dump_file, " Result (freq=%d): a%dr%d(%d)", ++ fprintf (ira_dump_file, " Result (freq=%d): a%dr%d(%d)", + ALLOCNO_COLOR_DATA (thread1)->thread_freq, + ALLOCNO_NUM (thread1), ALLOCNO_REGNO (thread1), + ALLOCNO_FREQ (thread1)); +@@ -2186,6 +2197,9 @@ form_threads_from_colorable_allocno (ira_allocno_t a) + ira_copy_t cp, next_cp; + int cp_num = 0; + ++ if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, " Forming thread from allocno a%dr%d:\n", ++ ALLOCNO_NUM (a), ALLOCNO_REGNO (a)); + for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp) + { + if (cp->first == a) +@@ -2507,7 +2521,13 @@ remove_allocno_from_bucket_and_push (ira_allocno_t allocno, bool colorable_p) + static void + push_only_colorable (void) + { ++ if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL) ++ fprintf (ira_dump_file, " Forming thread from colorable bucket:\n"); + form_threads_from_bucket (colorable_allocno_bucket); ++ for (ira_allocno_t a = colorable_allocno_bucket; ++ a != NULL; ++ a = ALLOCNO_COLOR_DATA (a)->next_bucket_allocno) ++ update_costs_from_prefs (a); + sort_bucket (&colorable_allocno_bucket, bucket_allocno_compare_func); + for (;colorable_allocno_bucket != NULL;) + remove_allocno_from_bucket_and_push (colorable_allocno_bucket, true); +@@ -2689,7 +2709,7 @@ pop_allocnos_from_stack (void) + else if (assign_hard_reg (allocno, false)) + { + if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL) +- fprintf (ira_dump_file, "assign reg %d\n", ++ fprintf (ira_dump_file, " assign reg %d\n", + ALLOCNO_HARD_REGNO (allocno)); + } + else if (ALLOCNO_ASSIGNED_P (allocno)) +@@ -3204,7 +3224,6 @@ color_allocnos (void) + if (ALLOCNO_CLASS (a) != NO_REGS && ! empty_profitable_hard_regs (a)) + { + ALLOCNO_COLOR_DATA (a)->in_graph_p = true; +- update_costs_from_prefs (a); + update_conflict_allocno_hard_prefs (a); + } + else +diff --git a/gcc/testsuite/gcc.target/i386/pr92807-1.c b/gcc/testsuite/gcc.target/i386/pr92807-1.c +index 00f92930a..02a0654dd 100644 +--- a/gcc/testsuite/gcc.target/i386/pr92807-1.c ++++ b/gcc/testsuite/gcc.target/i386/pr92807-1.c +@@ -8,4 +8,4 @@ abs2 (unsigned int a) + return (a+s)^s; + } + +-/* { dg-final { scan-assembler-not "leal" } } */ ++/* { dg-final { scan-assembler-not "leal\[\t \]*\[^(\]*\\((.*),\\1\\)" } } */ +-- +2.38.1.windows.1 + diff --git a/gcc.spec b/gcc.spec index d794101f7738ddb2627a677a06386e42f4e16490..27b3006061b33f11f0d078d279b21faecefa3834 100644 --- a/gcc.spec +++ b/gcc.spec @@ -61,7 +61,7 @@ Summary: Various compilers (C, C++, Objective-C, ...) Name: gcc Version: %{gcc_version} -Release: 58 +Release: 59 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD URL: https://gcc.gnu.org @@ -306,6 +306,8 @@ Patch195: 0195-add-whitelist-feature-for-OneProfile.patch Patch196: 0196-fix-bugs-in-loop-detections-add-filter-to-SSA-statem.patch Patch197: 0197-Add-hip09-machine-discribtion.patch Patch198: 0198-bugfix-Modify-the-hip09-CPU-information.patch +Patch199: 0199-Backport-Improve-hard-reg-preference-propapagation.patch + %global gcc_target_platform %{_arch}-linux-gnu %if %{build_go} @@ -956,6 +958,7 @@ not stable, so plugins must be rebuilt any time GCC is updated. %patch196 -p1 %patch197 -p1 %patch198 -p1 +%patch199 -p1 %build @@ -2990,6 +2993,12 @@ end %doc rpm.doc/changelogs/libcc1/ChangeLog* %changelog +* Sat Jun 15 2024 eastb233 - 10.3.1-59 +- Type:Sync +- ID:NA +- SUG:NA +- DESC: Sync patch from openeuler/gcc + * Fri Jun 14 2024 zhenyu zhao - 10.3.1-58 - Type:Sync - ID:NA