Я пишу компилятор, используя 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, что регистр или некоторая память во время чтения, как известно, содержат ненулевые данные?
Другой равный вопрос - если я скажу оптимизатору, что указатель ненулевой, это тоже было бы здорово.