Скажите оптимизатору LLVM содержимое переменных - PullRequest
5 голосов
/ 28 февраля 2012

Я пишу компилятор, используя 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 Ответ

1 голос
/ 28 февраля 2012

Вы могли бы написать собственный FunctionPass, который заменил бы переменную истинным значением, тогда он должен быть оптимизирован с помощью DCE или SimplifyCFG.http://llvm.org/docs/WritingAnLLVMPass.html

...