From 993e81363a9bc39906f17245abd27e2d7662016b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E7=86=99=E5=93=B2?= Date: Thu, 21 May 2026 17:10:36 +0800 Subject: [PATCH] fix(backend): recompute degree unconditionally after MergeInto\n\nAfter a merge, u inherits v's neighbors, so degree[u] must always\nbe recomputed. Previously, when degree[u] < K before merge, the\nstale low degree was kept, which could push a high-degree merged\nnode into simplify_worklist with wrong metadata.\n\nAlso remove redundant if(!remaining.empty()) guard in spill path\nand clean up extra brace from removed GiveUpPhase. --- src/mir/RegAlloc.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/mir/RegAlloc.cpp b/src/mir/RegAlloc.cpp index 42e8933c..a2b04a97 100644 --- a/src/mir/RegAlloc.cpp +++ b/src/mir/RegAlloc.cpp @@ -765,13 +765,11 @@ namespace mir } } move_adj[v].clear(); - if (degree[u] >= K) - { - int new_deg = 0; - for (int n : adj[u]) - if (remaining.count(GetRep(n))) new_deg++; - degree[u] = new_deg; - } + // 合并后重新计算 u 的度数(邻接集已包含 v 的邻接) + int new_deg = 0; + for (int n : adj[u]) + if (remaining.count(GetRep(n))) new_deg++; + degree[u] = new_deg; if (degree[u] < K && !HasMovePair(u)) simplify_worklist.push_back(u); }; @@ -894,8 +892,6 @@ namespace mir } else { - if (!remaining.empty()) - { // spill cost: len(活跃指令数)*5 + ref(def+use总次数)*15 - degree(干涉度数)*25 // cost 越小越优先 spill —— 短区间、少引用、高冲突的变量更适合溢出 // 权重基于经验调节:degree 项主导,len/ref 项作为 tiebreaker @@ -950,7 +946,6 @@ namespace mir { break; } - } } }