You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《ML现代编译器实现》寄存器分配器帧指针合并异常求助

寄存器分配器错误合并帧指针移动操作的问题

我无法理解为何寄存器分配器会将帧指针视为节点合并的合适候选——它本应与所有其他临时变量产生冲突,因此涉及帧指针的任何移动操作都应受到限制。

例如,以下是来自merge.tig的isdigit函数生成的汇编代码(包含已合并的移动操作):

L2_isdigit:
push rbp
mov rbp, rsp
push rbx
push r12
push r13
mov r10, rdi
L69:
mov r10, rbp
add r10, 16
mov r10, qword [r10]
mov r10, qword [r10+16]
add r10, -8
mov r10, qword [r10]
mov rdi, r10
call ord
mov r10, rax
mov r10, r10
mov r12, r10
mov r10, L4
mov rdi, r10
call ord
mov r10, rax
mov r10, r10
cmp r12, r10
jge L8
L9:
mov r10, 0
L10:
mov rax, r10
jmp L68
L8:
mov r13, 1
mov rbp, rbp
add rbp, 16
mov r10, qword [rbp]
mov r10, qword [r10+16]
add r10, -8
mov r10, qword [r10]
mov rdi, r10
call ord
mov r10, rax
mov r10, r10
mov r12, r10
mov r10, L5
mov rdi, r10
call ord
mov r10, rax
mov r10, r10
cmp r12, r10
jle L6
L7:
mov r13, 0
L6:
mov r10, r13
jmp L10
L68:
pop r13
pop r12
pop rbx
leave
ret 8

其中会破坏栈结构的问题代码片段是:

L8:
mov r13, 1
mov rbp, rbp
add rbp, 16
mov r10, qword [rbp]

执行leave指令时,这段修改过rbp的代码会导致栈结构损坏。未合并时的正确代码大致如下:

L8:
mov r13, 1
mov r10, rbp
add r10, 16
mov r10, qword [r10]

硬编码禁止所有涉及帧指针的移动操作参与合并是可行的,但这种方案不够优雅。我该如何让寄存器分配器意识到这种场景下合并是不安全的?我已经使用了书中教授的sink指令技巧,原本以为能解决该问题,但分配器仍然会尝试操作帧指针。

我严格按照书中内容实现了算法,可能存在错误但尚未发现,相关逻辑在项目的lib/backend/color.ml第73行。

提前感谢各位的帮助。

内容的提问来源于stack exchange,提问作者Bridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:05:27