diff --git a/src/RISCv64RegAlloc.cpp b/src/RISCv64RegAlloc.cpp index 5edcf98..329ddb8 100644 --- a/src/RISCv64RegAlloc.cpp +++ b/src/RISCv64RegAlloc.cpp @@ -436,8 +436,12 @@ void RISCv64RegAlloc::rewriteFunction() { if (reg_op->isVirtual()) { unsigned vreg = reg_op->getVRegNum(); if (color_map.count(vreg)) { - // 如果vreg被成功着色,替换为物理寄存器 - reg_op->setPReg(color_map.at(vreg)); + PhysicalReg preg = color_map.at(vreg); + reg_op->setPReg(preg); + // 检查这个物理寄存器是否是 s0-s11 + if (preg >= PhysicalReg::S0 && preg <= PhysicalReg::S11) { + used_callee_saved_regs.insert(preg); + } } else if (spilled_vregs.count(vreg)) { // 如果vreg被溢出,替换为专用的溢出物理寄存器t6 reg_op->setPReg(PhysicalReg::T6); diff --git a/src/include/RISCv64RegAlloc.h b/src/include/RISCv64RegAlloc.h index 724ad1c..dc63e62 100644 --- a/src/include/RISCv64RegAlloc.h +++ b/src/include/RISCv64RegAlloc.h @@ -54,8 +54,11 @@ private: // 这个map将在run()函数开始时被填充,并在rewriteFunction()中使用。 std::map vreg_to_value_map; + std::set used_callee_saved_regs; + // 用于计算类型大小的辅助函数 unsigned getTypeSizeInBytes(Type* type); + }; } // namespace sysy