[backend] 删除了部分错误代码
This commit is contained in:
@@ -237,6 +237,7 @@ std::string RISCv64CodeGen::basicBlock_gen(BasicBlock* bb, const RegAllocResult&
|
|||||||
else {
|
else {
|
||||||
ss << bb_name << ":\n"; // 基本块标签
|
ss << bb_name << ":\n"; // 基本块标签
|
||||||
}
|
}
|
||||||
|
if (DEBUG) std::cerr << "=== 生成基本块: " << bb_name << " ===\n";
|
||||||
|
|
||||||
// 构建当前基本块的 DAG
|
// 构建当前基本块的 DAG
|
||||||
auto dag_nodes_for_bb = build_dag(bb);
|
auto dag_nodes_for_bb = build_dag(bb);
|
||||||
@@ -678,17 +679,27 @@ void RISCv64CodeGen::select_instructions(DAGNode* node, const RegAllocResult& al
|
|||||||
|
|
||||||
// 获取分配的物理寄存器,若未分配则回退到 t0
|
// 获取分配的物理寄存器,若未分配则回退到 t0
|
||||||
auto get_preg_or_temp = [&](const std::string& vreg) {
|
auto get_preg_or_temp = [&](const std::string& vreg) {
|
||||||
|
if (vreg.empty()) { // 添加对空 vreg 的明确检查
|
||||||
|
if (DEBUG) std::cerr << "警告: 虚拟寄存器 (空字符串) 没有分配物理寄存器,使用临时寄存器 t0 代替。\n";
|
||||||
|
return reg_to_string(PhysicalReg::T0);
|
||||||
|
}
|
||||||
if (alloc.vreg_to_preg.count(vreg)) {
|
if (alloc.vreg_to_preg.count(vreg)) {
|
||||||
return reg_to_string(alloc.vreg_to_preg.at(vreg));
|
return reg_to_string(alloc.vreg_to_preg.at(vreg));
|
||||||
}
|
}
|
||||||
|
if (DEBUG) std::cerr << "警告: 虚拟寄存器 " << vreg << " 没有分配物理寄存器,使用临时寄存器 t0 代替。\n";
|
||||||
return reg_to_string(PhysicalReg::T0); // 回退到临时寄存器 t0
|
return reg_to_string(PhysicalReg::T0); // 回退到临时寄存器 t0
|
||||||
};
|
};
|
||||||
|
|
||||||
// 获取栈变量的内存偏移量
|
// 获取栈变量的内存偏移量
|
||||||
auto get_stack_offset = [&](Value* val) {
|
auto get_stack_offset = [&](Value* val) -> std::string { // 返回类型明确为 std::string
|
||||||
if (alloc.stack_map.count(val)) {
|
if (alloc.stack_map.count(val)) {
|
||||||
|
if (DEBUG) { // 避免在非DEBUG模式下打印大量内容
|
||||||
|
std::cout << "获取栈变量的内存偏移量,变量名: " << (val ? val->getName() : "unknown") << std::endl;
|
||||||
|
}
|
||||||
return std::to_string(alloc.stack_map.at(val));
|
return std::to_string(alloc.stack_map.at(val));
|
||||||
}
|
}
|
||||||
|
if (DEBUG) std::cerr << "警告: 栈变量 " << (val ? val->getName() : "unknown") << " 没有在栈映射中找到,使用默认偏移 0。\n";
|
||||||
|
// 如果没有找到映射,返回默认偏移量 "0"
|
||||||
return std::string("0"); // 默认或错误情况
|
return std::string("0"); // 默认或错误情况
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -762,6 +773,46 @@ void RISCv64CodeGen::select_instructions(DAGNode* node, const RegAllocResult& al
|
|||||||
if (!bin) break;
|
if (!bin) break;
|
||||||
|
|
||||||
std::string dest_reg = get_preg_or_temp(node->result_vreg);
|
std::string dest_reg = get_preg_or_temp(node->result_vreg);
|
||||||
|
|
||||||
|
// 检查是否是 base + offset 的地址计算
|
||||||
|
if (bin->getKind() == BinaryInst::kAdd) {
|
||||||
|
DAGNode* op0 = node->operands[0];
|
||||||
|
DAGNode* op1 = node->operands[1];
|
||||||
|
|
||||||
|
DAGNode* base_node = nullptr;
|
||||||
|
DAGNode* offset_node = nullptr;
|
||||||
|
bool is_alloca_base = false;
|
||||||
|
|
||||||
|
// 识别 base_address + byte_offset 模式
|
||||||
|
if (op0->kind == DAGNode::ALLOCA_ADDR) {
|
||||||
|
base_node = op0;
|
||||||
|
offset_node = op1;
|
||||||
|
is_alloca_base = true;
|
||||||
|
} else if (op1->kind == DAGNode::ALLOCA_ADDR) {
|
||||||
|
base_node = op1;
|
||||||
|
offset_node = op0;
|
||||||
|
is_alloca_base = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_alloca_base) {
|
||||||
|
if (auto alloca_inst = dynamic_cast<AllocaInst*>(base_node->value)) {
|
||||||
|
std::string offset_str = get_stack_offset(alloca_inst);
|
||||||
|
// 将字符串偏移量转换为 int,以便进行可能的调试和更清晰的逻辑
|
||||||
|
// 注意:addi 指令可以直接接受字符串形式的立即数
|
||||||
|
|
||||||
|
std::string offset_reg = get_preg_or_temp(offset_node->result_vreg); // 获取索引偏移量的寄存器
|
||||||
|
|
||||||
|
// 生成两条指令来计算最终地址:
|
||||||
|
// 1. addi 将 s0 加上 offset 得到 b 的实际基地址(放入 dest_reg)
|
||||||
|
// 2. addw 将 dest_reg 和索引偏移量寄存器相加,得到最终地址
|
||||||
|
ss_inst << "addi " << dest_reg << ", s0, " << offset_str << "\n"; // 使用字符串形式的偏移量
|
||||||
|
ss_inst << " addw " << dest_reg << ", " << dest_reg << ", " << offset_reg;
|
||||||
|
node->inst = ss_inst.str();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string lhs_reg = get_preg_or_temp(node->operands[0]->result_vreg);
|
std::string lhs_reg = get_preg_or_temp(node->operands[0]->result_vreg);
|
||||||
std::string rhs_reg = get_preg_or_temp(node->operands[1]->result_vreg);
|
std::string rhs_reg = get_preg_or_temp(node->operands[1]->result_vreg);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user