是否有一个简单的 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
:全局值编号
此遍执行全局值编号以消除完全和部分冗余指令。 它还执行冗余负载消除。
我想知道是否有任何现有的 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
:全局值编号
此遍执行全局值编号以消除完全和部分冗余指令。 它还执行冗余负载消除。