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

在LLVM IR中,如何获取指针类型的指针对象值?,llvm,Llvm,我正在写一张通行证,以便不断折叠。 像这样的C代码: int a = 4; int b = a + 5; 我想将其转换为: int b = 4 + 5; 但是第一段代码将为inta生成一条指令: store i32 4, i32* %a, align 4 如何从我的过程中的指针“i32*%a”获取值“%a”? 因此,我可以将值%a的所有用法替换为ConstantInt?使用说明: %1 = load i32* %a, align 4 为此,首先需要获得值%a的所有用途 Val.user_

我正在写一张通行证,以便不断折叠。 像这样的C代码:

int a = 4;
int b = a + 5;
我想将其转换为:

int b = 4 + 5;
但是第一段代码将为
inta
生成一条指令:

store i32 4, i32* %a, align 4
如何从我的过程中的指针“i32*%a”获取值“%a”? 因此,我可以将值%a的所有用法替换为ConstantInt?

使用说明:

%1 = load i32* %a, align 4

为此,首先需要获得值%a的所有用途

Val.user_begin() to val.user_end() via Value::const_user_iterator it
并检查是否存在存储的指令,以及是否只存储const

 if (const StoreInst* store = dyn_cast<StoreInst>(*it))
if(const StoreInst*store=dyn\u cast(*it))
然后可以用该常量替换所有实例。 注:这是您给出的inst的简单算法


a=5;b=a+4

如何在密码中加载地址?除非运行程序,否则
%a
的值未知。通行证不会运行程序。它只是检查和/或转换你的程序。哦,我明白了。但实际上,
%a
是一个“常数”。那么有没有其他方法来做这个常数折叠呢?我知道地址中存储了一个常量
4
,我想将
%a
的所有用法替换为
4
。我想您可能需要自己实现它。记住
存储
中的值,并将其用作
加载
中的替换项。但这可能会变得复杂,因为
%a
可以加载到
%1
%2
。。。和其他变量链。您是在运行时还是在传递过程中试图修改全局变量“a”吗?否,“a”是堆栈内存位置,由
alloca
分配。