【发布时间】:2016-08-16 07:39:47
【问题描述】:
当我尝试构建 LLVM 后端而不在 TableGen 文件中定义 RegisterClass 实例时,它会引发以下错误:
error:No 'RegisterClass' subclasses defined
如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?
【问题讨论】:
标签: compilation compiler-construction llvm
当我尝试构建 LLVM 后端而不在 TableGen 文件中定义 RegisterClass 实例时,它会引发以下错误:
error:No 'RegisterClass' subclasses defined
如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?
【问题讨论】:
标签: compilation compiler-construction llvm
只是不要这样做。 LLVM DAG是专门为寄存器机设计的,对于栈机编译价值不大。您需要一个自定义后端。
我用于解决类似问题的一种方法(LLVM IR -> FPGA 上的堆栈软核)如下:
1) 脱离 SSA (reg2mem)
2) 构建中间树表示(即,如果顺序允许,将所有一次性寄存器分配压缩到树中)。这是主要的优化瓶颈,留下的寄存器分配越少越好。
3) 剩余寄存器的“寄存器分配”现在都表示为堆栈分配的变量(希望您的堆栈机器 ISA 允许)。
4) 直接翻译树,无需任何指令选择(您可以在 LLVM IR 级别上执行此操作,而不是使用内在函数和自定义 instcombine 通道)。
编辑:使用基于 DAG 的后端来做到这一点并不容易,它从来没有打算以这种方式使用。
我能想到的最接近的事情是使用 DAG 后端生成中间寄存器机器代码,然后使用后处理传递在可能的情况下重新排序指令,否则注入堆栈分配的变量访问。即,将每个堆栈机器指令表示为具有 1 个或 2 个寄存器参数和 1 个寄存器结果的伪指令。
【讨论】:
(fadd:f32 (fmul:f32 (fadd:f32 W, X), Y), Z) - 就像 lisp ;) 所以将其转换为基于堆栈的机器代码似乎并不难。
虽然我同意不要这样做,但您应该看看 WebAssembly 后端。
https://github.com/llvm/llvm-project/tree/main/llvm/lib/Target/WebAssembly
【讨论】: