Optimization 告诉LLVM优化器变量的内容

Optimization 告诉LLVM优化器变量的内容,optimization,compiler-construction,llvm,Optimization,Compiler Construction,Llvm,我正在编写一个使用LLVM作为后端的编译器,并且有很多引用计数。借用对象时,会增加对象的引用计数器。当我释放一个对象时,我减少引用计数器,如果它变为零,则释放该对象。 但是,如果我只执行一小段代码,比如: ++obj->ref; global_variable_A = obj->a; if (--obj->ref == 0) free_object(obj); LLVM将其优化为(在IR中,但在C中这是相同的代码): 但因为我知道引用计数器在第一个语句之前总是正值,所

我正在编写一个使用LLVM作为后端的编译器,并且有很多引用计数。借用对象时,会增加对象的引用计数器。当我释放一个对象时,我减少引用计数器,如果它变为零,则释放该对象。 但是,如果我只执行一小段代码,比如:

++obj->ref;
global_variable_A = obj->a;
if (--obj->ref == 0)
    free_object(obj);
LLVM将其优化为(在IR中,但在C中这是相同的代码):

但因为我知道引用计数器在第一个语句之前总是正值,所以可以将其优化为

global_variable_A = obj->a;
我的问题:有没有办法告诉LLVM优化器,在读取寄存器或某个内存时,已知该寄存器或内存包含非零数据


另一个同样的问题是,如果我能告诉优化器指针是非空的,那也太好了。

您可以编写一个自定义函数pass,用真值替换变量,然后应该通过DCE或SimplifyCFG对其进行优化。

global_variable_A = obj->a;