我正在编写一个使用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优化器,在读取寄存器或某个存储器时,是否已知包含非零数据?
另一个相同的问题是,如果我可以告诉优化器指针是非空的,那也很好。
答案 0 :(得分:1)
您可以编写一个自定义的FunctionPass,它将用真值替换变量,然后它应该由DCE或SimplifyCFG优化。 http://llvm.org/docs/WritingAnLLVMPass.html