告诉LLVM优化器变量的内容

时间:2012-02-27 22:19:01

标签: optimization compiler-construction llvm

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

++obj->ref;
global_variable_A = obj->a;
if (--obj->ref == 0)
    free_object(obj);

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

global_variable_A = obj->a;
if (obj->ref == 0)
    free_object(obj);

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

global_variable_A = obj->a;

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

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

1 个答案:

答案 0 :(得分:1)

您可以编写一个自定义的FunctionPass,它将用真值替换变量,然后它应该由DCE或SimplifyCFG优化。  http://llvm.org/docs/WritingAnLLVMPass.html