LLVM学习笔记(51)
3.10. X86折叠表的生成( v7.0) 指令折叠是在寄存器分配过程中执行的优化,目的是删除不必要的拷贝指令。例如,这样的一组指令: %EBX = LOAD %mem_address %EAX = COPY %EBX 可以被安全地替换为单条指令: %EAX = LOAD %mem_address 通常,后者较前者更小,更快。 在 X86 中,许多指令有内存形式与寄存器形式,即通过内存或寄存器传递操作数。为了执行指令折叠优化,需要某种方式将这两种形式的同一条指令关联起来。目前 LLVM 维护了几张体量庞大的表用于关联这些指令。 Intel 以色列的雇员 Ayman Musa 开发了这部分的 codegen ,希望能通过 TableGen 自动生成这些表。不过这部分代码目前因为尚有 bug ,没有默认生成。 这里 有关于这个 bug 的描述。 总的来说,这是因为 Musa 的主要假设是同一条指令的这两个形式共享相同的编码信息,除了负责“如何向指令传递参数”的部分,其中一个版本定义其中一个参数是寄存器,另一个版本定义它为内存操作数,而其他参数以相同方式传递。 但实际上,某些指令在寄存器与内存形式间有不同与上面假设的情形,例如 bt (比特测试)指令,其寄存器形式寄存器参数相关比特是第 4 、 5 、 6 比特(依赖于模式与寄存器大小),而内存形式相关比特是第 16 、 32 或 64