【发布时间】:2017-08-13 15:07:26
【问题描述】:
我是 LLVM 新手,了解 LLVM 的指令生成。作为其中的一部分,我正在尝试将基本布尔指令转换为直接使用内存寄存器作为操作数。例如,在下面的 IR 中,我希望 and 操作使用 %a 和 %b 而不是 %11 和 %12。
%11 = load i32, i32* %a, align 4 \n
%12 = load i32, i32* %b, align 4 \n
%13 = and i32 %11, %12\
store i32 %13, i32* %d, align 4\n
我需要为此编写一个新的and 指令,还是有其他更简单的方法?
【问题讨论】:
-
%a和%b是指针,将它们与在一起意味着将它们加载的值与在一起。这真的是你想做的吗? -
我想获取 %a 和 %b 指向的值作为指令本身的一部分。我正在寻找这样的指令。 %13 = 和 i32* %a, i32* %b。这是为了了解我是否可以通过直接获取指针%a和%b的内容来删除之前的两个加载指令
-
好吧,那就不能了,只能显式地通过指针加载和存储
-
如果您正在编译的 CPU 存在适当的指令,我认为后端应该匹配此类模式。后端不仅采用一条 LLVM 指令并为其生成代码,而且还匹配 LLVM 指令的模式。因此,这些操作不必在 LLVM 级别组合,正如@harold 指出的那样,它们不能。这种优化更多的是为后端提供正确的指令定义。
标签: assembly llvm llvm-clang llvm-ir