在LLVM IR中,如何获取指针类型的指向值?

3
我正在编写一个用于常量折叠的Pass。 类似于这个C代码:
int a = 4;
int b = a + 5;

我希望将其转换为:

int b = 4 + 5;

但是第一段代码将生成一个名为int a的指令:

store i32 4, i32* %a, align 4

我该如何从指针“i32*%a”中获取值“%a”以在我的Pass中将所有使用Value%a的位置替换为ConstantInt?

你是在运行时还是在你的传递过程中尝试修改全局变量“a”? - 0-0
不是,“a”是由alloca分配的堆栈内存位置。 - wangbo15
2个回答

3
使用 load 指令:
%1 = load i32* %a, align 4

我该如何在我的Pass中加载地址? - wangbo15
除非您运行程序,否则无法确定“%a”的值。Pass 不会运行程序,只会检查和/或转换您的程序。 - dejvuth
哦,我明白了。但实际上%a是一个“常量”。那么有没有其他方法来进行这个常量折叠?我知道一个常量4存储在地址中,我想将所有使用%a的地方替换为4 - wangbo15
我猜你可能必须自己来实现这个功能。从“store”记忆值,然后在“load”中使用它作为替代。但这可能会变得很复杂,因为“%a”可以加载到“%1”、“%2”……以及其他变量的链中。 - dejvuth

0

为此,首先您需要获取Value %a的所有用途。

Val.user_begin() to val.user_end() via Value::const_user_iterator it

检查是否存在存储指令,且只存储常量

 if (const StoreInst* store = dyn_cast<StoreInst>(*it))

然后你可以用该常量替换所有实例。 注意:这是一个非常简单的算法,适用于你所给出的示例。

a = 5; b = a + 4;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接