From e4ad23a1a594a9da6b96655d4256352d5f6d277d Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Sun, 3 Aug 2025 18:37:08 +0800 Subject: [PATCH] =?UTF-8?q?[backend]=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=AF=84?= =?UTF-8?q?=E5=AD=98=E5=99=A8=E5=88=86=E9=85=8D=E5=99=A8=E5=9C=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=85=A8=E7=89=A9=E7=90=86=E5=AF=84=E5=AD=98=E5=99=A8?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=95=B0=E6=97=B6=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/runit-single.sh | 2 +- src/backend/RISCv64/RISCv64RegAlloc.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/script/runit-single.sh b/script/runit-single.sh index c6dacee..3cc47aa 100644 --- a/script/runit-single.sh +++ b/script/runit-single.sh @@ -184,7 +184,7 @@ for sy_file in "${SY_FILES[@]}"; do # 步骤 1: sysyc 编译 echo " 使用 sysyc 编译 (超时 ${SYSYC_TIMEOUT}s)..." timeout -s KILL ${SYSYC_TIMEOUT} "${SYSYC}" -S "${sy_file}" ${OPTIMIZE_FLAG} -o "${assembly_file}" - # timeout -s KILL ${SYSYC_TIMEOUT} "${SYSYC}" -s ir "${sy_file}" ${OPTIMIZE_FLAG} > "${ir_file}" + timeout -s KILL ${SYSYC_TIMEOUT} "${SYSYC}" -s ir "${sy_file}" ${OPTIMIZE_FLAG} > "${ir_file}" # timeout -s KILL ${SYSYC_TIMEOUT} "${SYSYC}" -s asmd "${sy_file}" > "${assembly_debug_file}" 2>&1 SYSYC_STATUS=$? if [ $SYSYC_STATUS -eq 124 ]; then diff --git a/src/backend/RISCv64/RISCv64RegAlloc.cpp b/src/backend/RISCv64/RISCv64RegAlloc.cpp index a1cd77c..87f276f 100644 --- a/src/backend/RISCv64/RISCv64RegAlloc.cpp +++ b/src/backend/RISCv64/RISCv64RegAlloc.cpp @@ -461,6 +461,17 @@ void RISCv64RegAlloc::coalesce() { unsigned y = getAlias(*use.begin()); unsigned u, v; if (precolored.count(y)) { u = y; v = x; } else { u = x; v = y; } + + // 防御性检查,处理物理寄存器之间的传送指令 + if (precolored.count(u) && precolored.count(v)) { + // 如果 u 和 v 都是物理寄存器,我们不能合并它们。 + // 这通常是一条寄存器拷贝指令,例如 `mv a2, a1`。 + // 把它加入 constrainedMoves 列表,然后直接返回,不再处理。 + constrainedMoves.insert(move); + // addWorklist(u) 和 addWorklist(v) 在这里也不需要调用, + // 因为它们只对虚拟寄存器有意义。 + return; + } if (DEEPERDEBUG) std::cerr << "[Coalesce] Processing move between " << regIdToString(x) << " and " << regIdToString(y) << " (aliases " << regIdToString(u)