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)