From e57ac7709d3cba962b428cd5a8b71743a409a24e Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Sat, 26 Jul 2025 12:39:17 +0800 Subject: [PATCH] =?UTF-8?q?[backend]=E5=BC=80=E5=A7=8B=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E8=80=85=E4=BF=9D=E5=AD=98=E5=AF=84=E5=AD=98?= =?UTF-8?q?=E5=99=A8=E4=B8=8E=E8=A2=AB=E8=B0=83=E7=94=A8=E8=80=85=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=AF=84=E5=AD=98=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/RISCv64RegAlloc.cpp | 8 ++++++-- src/include/RISCv64RegAlloc.h | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) 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