告诉LLVM优化器变量的内容

Emi*_*mil 5 compiler-construction optimization llvm

我正在编写一个使用LLVM作为后端的编译器,并且有很多引用计数.当我借用一个对象时,我会增加对象的引用计数器.当我释放一个对象时,我减少了参考计数器,并在它变为零时释放该对象.但是,如果我只做一小段代码,就像这样:

++obj->ref;
global_variable_A = obj->a;
if (--obj->ref == 0)
    free_object(obj);
Run Code Online (Sandbox Code Playgroud)

LLVM将此优化为(在IR中,但这是C中的相等代码):

global_variable_A = obj->a;
if (obj->ref == 0)
    free_object(obj);
Run Code Online (Sandbox Code Playgroud)

但是因为我知道在第一个语句之前引用计数器总是正数,所以它只能被优化

global_variable_A = obj->a;
Run Code Online (Sandbox Code Playgroud)

我的问题:有没有办法告诉LLVM优化器,在读取它时,寄存器或某些内存是否包含非零数据?

另一个相同的问题是,如果我可以告诉优化器指针是非空的,那也很好.

joe*_*oey 1

您可以编写一个自定义 FunctionPass,将变量替换为真实值,然后应通过 DCE 或 SimplifyCFG 对其进行优化。 http://llvm.org/docs/WritingAnLLVMPass.html