Assembly 将涉及CPU寄存器的指令转换为内存指令

Assembly 将涉及CPU寄存器的指令转换为内存指令,assembly,llvm,llvm-clang,llvm-ir,Assembly,Llvm,Llvm Clang,Llvm Ir,我是LLVM新手,了解LLVM生成指令的过程。作为这项工作的一部分,我正在尝试将基本布尔指令转换为直接使用内存寄存器作为操作数。例如,在下面的IR中,我希望和操作使用%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 我是否需要为此编写一个新的和指令,还

我是LLVM新手,了解LLVM生成指令的过程。作为这项工作的一部分,我正在尝试将基本布尔指令转换为直接使用内存寄存器作为操作数。例如,在下面的IR中,我希望
操作使用
%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

我是否需要为此编写一个新的
指令,还是有其他更简单的方法?

我认为这是不可行的。如果没有显式加载或存储,则无法访问LLVM中的内存。

%a
%b
是指针,将它们相加意味着将从它们加载的值相加。这真的是您想要做的吗?我想获取由%a和%b指向的值,作为指令本身的一部分。我正在寻找类似这样的指导13=和i32*%a,i32*%b。这是为了理解我是否可以在直接获取指针%a和%b的内容之前删除这两条加载指令,而这是无法完成的。然后,通过指针加载和存储只能明确完成。我认为,如果为您编译的CPU存在适当的指令,后端应该匹配这些模式。后端不只是获取一条LLVM指令并为其生成代码,而是匹配LLVM指令的模式。因此,这些操作不必在LLVM级别进行组合,正如@harold所指出的那样,它们不能被组合。这种优化更多的是为后端提供正确的指令定义。