【发布时间】:2012-02-27 22:19:00
【问题描述】:
我正在编写一个使用 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 优化器,在读取寄存器或某个内存时,它已知包含非零数据?
另一个相同的问题是,如果我可以告诉优化器一个指针是非空的,那也很好。
【问题讨论】:
标签: optimization compiler-construction llvm