是否有一个简单的 LLVM Pass 组合了连续的一对常量 Store 和 Load?

Is there a simple LLVM Pass that combine a consecutive pair of Store and Load of a constant?

我想知道是否有任何现有的 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

在这里,我无法使用通行证-mem2reg,因为寄存器%2、%3、%4、%5 由于第2 和第3 存储而无法消除。我也尝试过 pass -instcombine 但它做了很多我不想使用的其他简化策略。

有谁知道是否有一个现有的 pass 可以简单地组合和消除连续的常量加载和存储?

感谢您花时间阅读我的问题。

-gvn是您要找的吗?

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