[backend-IRC]添加了三级调试打印逻辑

This commit is contained in:
Lixuanwang
2025-08-01 23:18:53 +08:00
parent 57fe17dc21
commit 384f7c548b
3 changed files with 85 additions and 94 deletions

View File

@ -1,5 +1,3 @@
// in file: RISCv64RegAlloc.cpp
#include "RISCv64RegAlloc.h"
#include "RISCv64AsmPrinter.h"
#include <algorithm>
@ -263,7 +261,7 @@ void RISCv64RegAlloc::build() {
getInstrUseDef_Liveness(instr, use, def);
// 调试输出 use 和 def (保留您的调试逻辑)
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "Instr:";
printer_inside_build.printInstruction(instr_ptr.get(), true);
auto print_set = [this](const VRegSet& s, const std::string& name) {
@ -278,7 +276,7 @@ void RISCv64RegAlloc::build() {
for (unsigned v : use) {
if (!coloredNodes.count(v) && !precolored.count(v)) {
initial.insert(v);
} else if (DEEPDEBUG) {
} else if ((DEEPDEBUG && initial.size() < DEBUGLENGTH) || DEEPERDEBUG) {
// 这里的调试信息可以更精确
if (precolored.count(v)) {
std::cerr << "Skipping " << regIdToString(v) << " because it is a physical register.\n";
@ -290,7 +288,7 @@ void RISCv64RegAlloc::build() {
for (unsigned v : def) {
if (!coloredNodes.count(v) && !precolored.count(v)) {
initial.insert(v);
} else if (DEEPDEBUG) {
} else if ((DEEPDEBUG && initial.size() < DEBUGLENGTH) || DEEPERDEBUG) {
if (precolored.count(v)) {
std::cerr << "Skipping " << regIdToString(v) << " because it is a physical register.\n";
} else {
@ -302,9 +300,20 @@ void RISCv64RegAlloc::build() {
}
if (DEEPDEBUG) {
std::cerr << "Initial set after build: { ";
for (unsigned v : initial) std::cerr << regIdToString(v) << " ";
std::cerr << "}\n";
if (initial.size() > DEBUGLENGTH && !DEEPERDEBUG) {
std::cerr << "Initial set too large, showing first " << DEBUGLENGTH << " elements:\n";
}
std::cerr << "Initial set (" << initial.size() << "): { ";
unsigned count = 0;
for (unsigned v : initial) {
if (count++ >= DEBUGLENGTH && !DEEPERDEBUG) break; // 限制输出数量
std::cerr << regIdToString(v) << " ";
}
if (count < initial.size()) {
std::cerr << "... (total " << initial.size() << " elements)\n";
} else {
std::cerr << "}\n";
}
}
// 2. 为所有参与图构建的虚拟寄存器initial + coloredNodes初始化数据结构
@ -331,7 +340,7 @@ void RISCv64RegAlloc::build() {
const VRegSet& live_out = live_out_map.at(instr);
// 保留您的指令级调试输出
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
RISCv64AsmPrinter temp_printer(MFunc);
temp_printer.setStream(std::cerr);
std::cerr << "Instr: ";
@ -417,7 +426,7 @@ void RISCv64RegAlloc::makeWorklist() {
std::cerr << "Error: degree not initialized for %vreg" << n << "\n";
continue;
}
if (DEEPDEBUG) {
if ((DEEPDEBUG && initial.size() < DEBUGLENGTH) || DEEPERDEBUG) {
std::cerr << "Assigning %vreg" << n << " (degree=" << degree.at(n)
<< ", moveRelated=" << moveRelated(n) << ")\n";
}
@ -429,7 +438,7 @@ void RISCv64RegAlloc::makeWorklist() {
simplifyWorklist.insert(n);
}
}
if (DEEPDEBUG) std::cerr << "--------------------------------\n";
if (DEEPDEBUG || DEEPERDEBUG) std::cerr << "--------------------------------\n";
initial.clear();
}
@ -437,7 +446,7 @@ void RISCv64RegAlloc::makeWorklist() {
void RISCv64RegAlloc::simplify() {
unsigned n = *simplifyWorklist.begin();
simplifyWorklist.erase(simplifyWorklist.begin());
if (DEEPDEBUG) std::cerr << "[Simplify] Popped %vreg" << n << ", pushing to stack.\n";
if (DEEPERDEBUG) std::cerr << "[Simplify] Popped %vreg" << n << ", pushing to stack.\n";
selectStack.push_back(n);
for (unsigned m : adjacent(n)) {
decrementDegree(m);
@ -455,19 +464,19 @@ void RISCv64RegAlloc::coalesce() {
unsigned u, v;
if (precolored.count(y)) { u = y; v = x; } else { u = x; v = y; }
if (DEEPDEBUG) std::cerr << "[Coalesce] Processing move between " << regIdToString(x)
if (DEEPERDEBUG) std::cerr << "[Coalesce] Processing move between " << regIdToString(x)
<< " and " << regIdToString(y) << " (aliases " << regIdToString(u)
<< ", " << regIdToString(v) << ").\n";
if (u == v) {
if (DEEPDEBUG) std::cerr << " -> Trivial coalesce (u == v).\n";
if (DEEPERDEBUG) std::cerr << " -> Trivial coalesce (u == v).\n";
coalescedMoves.insert(move);
addWorklist(u);
return; // 处理完毕,提前返回
}
if (isFPVReg(u) != isFPVReg(v)) {
if (DEEPDEBUG) std::cerr << " -> Constrained (type mismatch: " << regIdToString(u) << " is "
if (DEEPERDEBUG) std::cerr << " -> Constrained (type mismatch: " << regIdToString(u) << " is "
<< (isFPVReg(u) ? "float" : "int") << ", " << regIdToString(v) << " is "
<< (isFPVReg(v) ? "float" : "int") << ").\n";
constrainedMoves.insert(move);
@ -481,7 +490,7 @@ void RISCv64RegAlloc::coalesce() {
bool pre_interfere = adjList.at(v).count(u);
if (pre_interfere) {
if (DEEPDEBUG) std::cerr << " -> Constrained (nodes already interfere).\n";
if (DEEPERDEBUG) std::cerr << " -> Constrained (nodes already interfere).\n";
constrainedMoves.insert(move);
addWorklist(u);
addWorklist(v);
@ -493,13 +502,13 @@ void RISCv64RegAlloc::coalesce() {
if (is_u_precolored) {
// --- 场景1u是物理寄存器使用 George 启发式 ---
if (DEEPDEBUG) std::cerr << " -> Trying George Heuristic (u is precolored)...\n";
if (DEEPERDEBUG) std::cerr << " -> Trying George Heuristic (u is precolored)...\n";
// ==================== [展开的 std::all_of 逻辑] ====================
// 步骤 1: 独立调用 adjacent(v) 获取邻居集合
VRegSet neighbors_of_v = adjacent(v);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << " - Neighbors of " << regIdToString(v) << " to check are (" << neighbors_of_v.size() << "): { ";
for (unsigned id : neighbors_of_v) std::cerr << regIdToString(id) << " ";
std::cerr << "}\n";
@ -508,14 +517,14 @@ void RISCv64RegAlloc::coalesce() {
// 步骤 2: 使用显式的 for 循环来代替 std::all_of
bool george_ok = true; // 默认假设成功,任何一个邻居失败都会将此设为 false
for (unsigned t : neighbors_of_v) {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << " - Checking neighbor " << regIdToString(t) << ":\n";
}
// 步骤 3: 独立调用启发式函数
bool heuristic_result = georgeHeuristic(t, u);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << " - georgeHeuristic(" << regIdToString(t) << ", " << regIdToString(u) << ") -> " << (heuristic_result ? "OK" : "FAIL") << "\n";
}
@ -525,7 +534,7 @@ void RISCv64RegAlloc::coalesce() {
}
}
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << " -> George Heuristic final result: " << (george_ok ? "OK" : "FAIL") << "\n";
}
// =================================================================
@ -536,10 +545,10 @@ void RISCv64RegAlloc::coalesce() {
} else {
// --- 场景2u和v都是虚拟寄存器使用 Briggs 启发式 ---
if (DEEPDEBUG) std::cerr << " -> Trying Briggs Heuristic (u and v are virtual)...\n";
if (DEEPERDEBUG) std::cerr << " -> Trying Briggs Heuristic (u and v are virtual)...\n";
bool briggs_ok = briggsHeuristic(u, v);
if (DEEPDEBUG) std::cerr << " - briggsHeuristic(" << regIdToString(u) << ", " << regIdToString(v) << ") -> " << (briggs_ok ? "OK" : "FAIL") << "\n";
if (DEEPERDEBUG) std::cerr << " - briggsHeuristic(" << regIdToString(u) << ", " << regIdToString(v) << ") -> " << (briggs_ok ? "OK" : "FAIL") << "\n";
if (briggs_ok) {
can_coalesce = true;
@ -549,12 +558,12 @@ void RISCv64RegAlloc::coalesce() {
// --- 根据启发式结果进行最终决策 ---
if (can_coalesce) {
if (DEEPDEBUG) std::cerr << " -> Heuristic OK. Combining " << regIdToString(v) << " into " << regIdToString(u) << ".\n";
if (DEEPERDEBUG) std::cerr << " -> Heuristic OK. Combining " << regIdToString(v) << " into " << regIdToString(u) << ".\n";
coalescedMoves.insert(move);
combine(u, v);
addWorklist(u);
} else {
if (DEEPDEBUG) std::cerr << " -> Heuristic failed. Adding to active moves.\n";
if (DEEPERDEBUG) std::cerr << " -> Heuristic failed. Adding to active moves.\n";
activeMoves.insert(move);
}
}
@ -563,58 +572,24 @@ void RISCv64RegAlloc::coalesce() {
void RISCv64RegAlloc::freeze() {
unsigned u = *freezeWorklist.begin();
freezeWorklist.erase(freezeWorklist.begin());
if (DEEPDEBUG) std::cerr << "[Freeze] Freezing %vreg" << u << " and moving to simplify list.\n";
if (DEEPERDEBUG) std::cerr << "[Freeze] Freezing %vreg" << u << " and moving to simplify list.\n";
simplifyWorklist.insert(u);
freezeMoves(u);
}
// // 选择溢出节点
// // in file: RISCv64RegAlloc.cpp
// void RISCv64RegAlloc::selectSpill() {
// // [核心逻辑修正] 遵从 George & Appel 论文的“乐观着色”策略。
// // 此函数不再将节点直接放入 spilledNodes。
// // 它的作用是选择一个“潜在溢出”节点,并将其移回 simplifyWorklist以打破僵局。
// // 真正的溢出决策被推迟到 AssignColors 阶段。
// // 使用启发式规则从 spillWorklist 中选择一个节点 m。
// // 论文建议使用代价函数,这里我们继续使用度数最高的简单启发式。
// auto it = std::max_element(spillWorklist.begin(), spillWorklist.end(),
// [&](unsigned a, unsigned b){ return degree.at(a) < degree.at(b); });
// // 理论上此时 spillWorklist 不应为空,但做保护性检查。
// if (it == spillWorklist.end()) {
// return;
// }
// unsigned m = *it;
// // 1. 将选中的节点 m 从溢出工作列表移动到简化工作列表。
// spillWorklist.erase(it);
// simplifyWorklist.insert(m); //
// // 2. 冻结与 m 相关的所有传送指令,因为我们已经放弃了对它的合并尝试。
// freezeMoves(m); //
// if (DEEPDEBUG) {
// std::cerr << "[Spill] Optimistically moving %vreg" << m
// << " from spillWorklist to simplifyWorklist.\n";
// }
// }
// 选择溢出节点
void RISCv64RegAlloc::selectSpill() {
auto it = std::max_element(spillWorklist.begin(), spillWorklist.end(),
[&](unsigned a, unsigned b){ return degree.at(a) < degree.at(b); });
unsigned m = *it;
spillWorklist.erase(it);
if (DEEPDEBUG) std::cerr << "[Spill] Selecting %vreg" << m << " to spill.\n";
if (DEEPERDEBUG) std::cerr << "[Spill] Selecting %vreg" << m << " to spill.\n";
simplifyWorklist.insert(m);
freezeMoves(m);
}
void RISCv64RegAlloc::assignColors() {
if (DEEPDEBUG) std::cerr << "[AssignColors] Starting...\n";
if (DEEPERDEBUG) std::cerr << "[AssignColors] Starting...\n";
// 步骤 1: 为 selectStack 中的节点分配颜色 (此部分逻辑不变)
while (!selectStack.empty()) {
unsigned n = selectStack.back();
@ -638,12 +613,12 @@ void RISCv64RegAlloc::assignColors() {
if (ok_colors.empty()) {
spilledNodes.insert(n);
if (DEEPDEBUG) std::cerr << " -> WARNING: No color for %vreg" << n << " from selectStack. Spilling.\n";
if (DEEPERDEBUG) std::cerr << " -> WARNING: No color for %vreg" << n << " from selectStack. Spilling.\n";
} else {
PhysicalReg c = *ok_colors.begin();
coloredNodes.insert(n);
color_map[n] = c;
if (DEEPDEBUG) std::cerr << " -> Colored %vreg" << n << " with " << regToString(c) << ".\n";
if (DEEPERDEBUG) std::cerr << " -> Colored %vreg" << n << " with " << regToString(c) << ".\n";
}
}
@ -657,17 +632,17 @@ void RISCv64RegAlloc::assignColors() {
if (precolored.count(root_alias)) {
const unsigned offset = static_cast<unsigned>(PhysicalReg::PHYS_REG_START_ID);
color_map[n] = static_cast<PhysicalReg>(root_alias - offset);
if (DEEPDEBUG) std::cerr << " -> Coalesced %vreg" << n << " gets color from PHYSICAL alias " << regIdToString(root_alias) << ".\n";
if (DEEPERDEBUG) std::cerr << " -> Coalesced %vreg" << n << " gets color from PHYSICAL alias " << regIdToString(root_alias) << ".\n";
}
// 情况 2: 别名是被成功着色的虚拟寄存器
else if (color_map.count(root_alias)) {
color_map[n] = color_map.at(root_alias);
if (DEEPDEBUG) std::cerr << " -> Coalesced %vreg" << n << " gets color from VIRTUAL alias " << regIdToString(root_alias) << ".\n";
if (DEEPERDEBUG) std::cerr << " -> Coalesced %vreg" << n << " gets color from VIRTUAL alias " << regIdToString(root_alias) << ".\n";
}
// 情况 3: 别名是被溢出的虚拟寄存器
else {
spilledNodes.insert(n);
if (DEEPDEBUG) std::cerr << " -> Alias " << regIdToString(root_alias) << " of %vreg" << n << " was SPILLED. Spilling %vreg" << n << " as well.\n";
if (DEEPERDEBUG) std::cerr << " -> Alias " << regIdToString(root_alias) << " of %vreg" << n << " was SPILLED. Spilling %vreg" << n << " as well.\n";
}
}
}
@ -1024,14 +999,14 @@ void RISCv64RegAlloc::addEdge(unsigned u, unsigned v) {
RISCv64RegAlloc::VRegSet RISCv64RegAlloc::adjacent(unsigned n) {
// 仅在 DEEPDEBUG 模式下启用详细日志
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
// 使用 regIdToString 打印节点 n无论是物理还是虚拟
std::cerr << "\n[adjacent] >>>>> Executing for node " << regIdToString(n) << " <<<<<\n";
}
// 1. 如果节点 n 是物理寄存器,它没有邻接表,直接返回空集
if (precolored.count(n)) {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[adjacent] Node " << regIdToString(n) << " is precolored. Returning {}.\n";
}
return {};
@ -1039,7 +1014,7 @@ RISCv64RegAlloc::VRegSet RISCv64RegAlloc::adjacent(unsigned n) {
// 安全检查:确保 n 在 adjList 中存在,防止 map::at 崩溃
if (adjList.count(n) == 0) {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[adjacent] WARNING: Node " << regIdToString(n) << " not found in adjList. Returning {}.\n";
}
return {};
@ -1048,7 +1023,7 @@ RISCv64RegAlloc::VRegSet RISCv64RegAlloc::adjacent(unsigned n) {
// 2. 获取 n 在冲突图中的所有邻居
VRegSet result = adjList.at(n);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
// 定义一个局部的 lambda 方便打印集合
auto print_set = [this](const VRegSet& s, const std::string& name) {
std::cerr << "[adjacent] " << name << " (" << s.size() << "): { ";
@ -1065,11 +1040,11 @@ RISCv64RegAlloc::VRegSet RISCv64RegAlloc::adjacent(unsigned n) {
VRegSet removed_from_stack; // 仅用于调试打印
for (auto it = selectStack.rbegin(); it != selectStack.rend(); ++it) {
if (result.count(*it)) {
if (DEEPDEBUG) removed_from_stack.insert(*it);
if (DEEPERDEBUG) removed_from_stack.insert(*it);
result.erase(*it);
}
}
if (DEEPDEBUG && !removed_from_stack.empty()) {
if (DEEPERDEBUG && !removed_from_stack.empty()) {
std::cerr << "[adjacent] - Removed from selectStack: { ";
for(unsigned id : removed_from_stack) std::cerr << regIdToString(id) << " ";
std::cerr << "}\n";
@ -1079,18 +1054,18 @@ RISCv64RegAlloc::VRegSet RISCv64RegAlloc::adjacent(unsigned n) {
VRegSet removed_from_coalesced; // 仅用于调试打印
for (unsigned cn : coalescedNodes) {
if (result.count(cn)) {
if (DEEPDEBUG) removed_from_coalesced.insert(cn);
if (DEEPERDEBUG) removed_from_coalesced.insert(cn);
result.erase(cn);
}
}
if (DEEPDEBUG && !removed_from_coalesced.empty()) {
if (DEEPERDEBUG && !removed_from_coalesced.empty()) {
std::cerr << "[adjacent] - Removed from coalescedNodes: { ";
for(unsigned id : removed_from_coalesced) std::cerr << regIdToString(id) << " ";
std::cerr << "}\n";
}
// 4. 返回最终的、过滤后的“有效”邻居集合
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[adjacent] >>>>> Returning final adjacent set (" << result.size() << "): { ";
for (unsigned id : result) std::cerr << regIdToString(id) << " ";
std::cerr << "}\n\n";
@ -1132,12 +1107,12 @@ void RISCv64RegAlloc::decrementDegree(unsigned m) {
enableMoves(nodes_to_enable);
spillWorklist.erase(m);
if (moveRelated(m)) {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[decrementDegree] Node " << regIdToString(m) << " has degree " << d << ", now decremented to " << degree.at(m) << ". Added to freezeWorklist.\n";
}
freezeWorklist.insert(m);
} else {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[decrementDegree] Node " << regIdToString(m) << " has degree " << d << ", now decremented to " << degree.at(m) << ". Added to simplifyWorklist.\n";
}
simplifyWorklist.insert(m);
@ -1176,7 +1151,7 @@ void RISCv64RegAlloc::addWorklist(unsigned u) {
if (!moveRelated(u) && degree.at(u) < K) {
freezeWorklist.erase(u);
simplifyWorklist.insert(u);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[addWorklist] Node " << regIdToString(u) << " added to simplifyWorklist (degree: " << degree.at(u) << ", K: " << K << ").\n";
}
}
@ -1184,7 +1159,7 @@ void RISCv64RegAlloc::addWorklist(unsigned u) {
// Briggs启发式
bool RISCv64RegAlloc::briggsHeuristic(unsigned u, unsigned v) {
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "\n[Briggs] >>>>> Checking coalesce between " << regIdToString(u) << " and " << regIdToString(v) << " <<<<<\n";
}
@ -1196,7 +1171,7 @@ bool RISCv64RegAlloc::briggsHeuristic(unsigned u, unsigned v) {
VRegSet all_adj = u_adj;
all_adj.insert(v_adj.begin(), v_adj.end());
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
auto print_set = [this](const VRegSet& s, const std::string& name) {
std::cerr << "[Briggs] " << name << " (" << s.size() << "): { ";
for (unsigned id : s) std::cerr << regIdToString(id) << " ";
@ -1209,14 +1184,14 @@ bool RISCv64RegAlloc::briggsHeuristic(unsigned u, unsigned v) {
// 步骤 3: 遍历合并后的邻居集合,计算度数 >= K 的节点数量
int k = 0;
if (DEEPDEBUG) std::cerr << "[Briggs] Checking significance of combined neighbors:\n";
if (DEEPERDEBUG) std::cerr << "[Briggs] Checking significance of combined neighbors:\n";
for (unsigned n : all_adj) {
// 关键修正:只考虑那些在工作集中的邻居节点 n
if (degree.count(n) > 0) {
int K = isFPVReg(n) ? K_fp : K_int;
if (degree.at(n) >= K) {
k++;
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[Briggs] - Node " << regIdToString(n) << " is significant (degree " << degree.at(n) << " >= " << K << "). Count k is now " << k << ".\n";
}
}
@ -1227,12 +1202,11 @@ bool RISCv64RegAlloc::briggsHeuristic(unsigned u, unsigned v) {
int K_u = isFPVReg(u) ? K_fp : K_int;
bool result = (k < K_u);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[Briggs] Final count of significant neighbors (k) = " << k << ".\n";
std::cerr << "[Briggs] K value for node " << regIdToString(u) << " is " << K_u << ".\n";
std::cerr << "[Briggs] >>>>> Result (k < K): " << (result ? "OK (can coalesce)" : "FAIL (cannot coalesce)") << "\n\n";
}
return result;
}
@ -1336,7 +1310,7 @@ void RISCv64RegAlloc::freezeMoves(unsigned u) {
if (!precolored.count(v_alias) && nodeMoves(v_alias).empty() && degree.at(v_alias) < (isFPVReg(v_alias) ? K_fp : K_int)) {
freezeWorklist.erase(v_alias);
simplifyWorklist.insert(v_alias);
if (DEEPDEBUG) {
if (DEEPERDEBUG) {
std::cerr << "[freezeMoves] Node " << regIdToString(v_alias) << " moved to simplifyWorklist (degree: " << degree.at(v_alias) << ").\n";
}
}
@ -1431,9 +1405,26 @@ void RISCv64RegAlloc::dumpState(const std::string& stage) {
if (!DEEPDEBUG) return;
std::cerr << "\n=============== STATE DUMP (" << stage << ") ===============\n";
auto print_vreg_set = [&](const VRegSet& s, const std::string& name){
std::cerr << name << " (" << s.size() << "): { ";
for(unsigned v : s) std::cerr << "%vreg" << v << " ";
std::cerr << "}\n";
if (s.size() > DEBUGLENGTH) {
std::cerr << name << " (" << s.size() << ")\n";
}
else {
std::cerr << name << " (" << s.size() << "): { ";
for(unsigned v : s) std::cerr << "%vreg" << v << " ";
std::cerr << "}\n";
}
};
auto print_vreg_stack = [&](const VRegStack& s, const std::string& name){
if (s.size() > DEBUGLENGTH) {
std::cerr << name << " (" << s.size() << ")\n";
}
else {
std::cerr << name << " (" << s.size() << "): { ";
for(unsigned v : s) std::cerr << "%vreg" << v << " ";
std::cerr << "}\n";
}
};
print_vreg_set(simplifyWorklist, "SimplifyWorklist");
print_vreg_set(freezeWorklist, "FreezeWorklist");
@ -1441,9 +1432,7 @@ void RISCv64RegAlloc::dumpState(const std::string& stage) {
print_vreg_set(coalescedNodes, "CoalescedNodes");
print_vreg_set(spilledNodes, "SpilledNodes");
std::cerr << "SelectStack (" << selectStack.size() << "): { ";
for(unsigned v : selectStack) std::cerr << "%vreg" << v << " ";
std::cerr << "}\n";
print_vreg_stack(selectStack, "SelectStack");
std::cerr << "WorklistMoves (" << worklistMoves.size() << ")\n";
std::cerr << "ActiveMoves (" << activeMoves.size() << ")\n";

View File

@ -1,5 +1,3 @@
// in file: RISCv64RegAlloc.h
#ifndef RISCV64_REGALLOC_H
#define RISCV64_REGALLOC_H
@ -12,6 +10,8 @@
extern int DEBUG;
extern int DEEPDEBUG;
extern int DEBUGLENGTH; // 用于限制调试输出的长度
extern int DEEPERDEBUG; // 用于更深层次的调试输出
namespace sysy {

View File

@ -21,6 +21,8 @@ using namespace sysy;
int DEBUG = 0;
int DEEPDEBUG = 0;
int DEEPERDEBUG = 0;
int DEBUGLENGTH = 50;
static string argStopAfter;
static string argInputFile;