《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
相关产品推荐
相关产品推荐

