Optimization 是否有一个简单的LLVM过程,它结合了一个常量的连续存储和加载对?

Optimization 是否有一个简单的LLVM过程,它结合了一个常量的连续存储和加载对?,optimization,llvm,llvm-ir,Optimization,Llvm,Llvm Ir,我想知道是否有任何现有的LLVMopt工具可以帮助组合常量的连续加载和存储 例如,这里是我的简单位代码,它首先将常量1存储到两个寄存器中,然后立即加载它 %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 %4 = alloca i32*, align 8 %5 = alloca i32*, align 8 store i32 0, i32* %1, align 4 st

我想知道是否有任何现有的LLVM
opt
工具可以帮助组合常量的连续加载和存储

例如,这里是我的简单位代码,它首先将常量1存储到两个寄存器中,然后立即加载它

  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32*, align 8
  %5 = alloca i32*, align 8
  store i32 0, i32* %1, align 4
  store i32* %2, i32** %4, align 8
  store i32* %3, i32** %5, align 8
  store i32 1, i32* %2, align 4
  store i32 1, i32* %3, align 4
  %6 = load i32, i32* %2, align 4
  %7 = load i32, i32* %3, align 4
  %8 = icmp eq i32 %6, %7
我希望将上述代码简化为如下内容:

  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32*, align 8
  %5 = alloca i32*, align 8
  store i32 0, i32* %1, align 4
  store i32* %2, i32** %4, align 8
  store i32* %3, i32** %5, align 8
  %8 = icmp eq i32 1, 1
在这里,我不能使用pass
-mem2reg
,因为寄存器%2、%3、%4、%5由于第2和第3个存储无法消除。我还尝试了pass
-instcombine
,但它有许多我不想使用的简化策略

有人知道是否有一个现有的过程可以简单地合并并消除常量的连续加载和存储吗

谢谢你花时间阅读我的问题。

你在找什么

-gvn
:全局值编号
此过程执行全局值编号,以消除全部和部分冗余指令。它还执行冗余负载消除。

做了您想做的事情吗?您好,
-mem2reg
不能用于消除
%2
%3
,因为这些寄存器也在两条指令中使用:
存储i32*%2,i32**%4,对齐8
存储i32*%3,i32**%5,对齐8
非常感谢您的建议。冗余负载消除正是我想要的。虽然
-gvn
似乎比我预期的做了更多的优化,但这是我进一步研究的一个很好的线索。