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.

master
黄熙哲 1 week ago
parent bef03ec220
commit 993e81363a

@ -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;
}
}
}
}

Loading…
Cancel
Save