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优化器,在读取它时,寄存器或某些内存是否包含非零数据?
另一个相同的问题是,如果我可以告诉优化器指针是非空的,那也很好.
您可以编写一个自定义 FunctionPass,将变量替换为真实值,然后应通过 DCE 或 SimplifyCFG 对其进行优化。 http://llvm.org/docs/WritingAnLLVMPass.html