не будет оптимизации для определенных инструкций - PullRequest
0 голосов
/ 07 января 2019

Я вставляю некоторые инструкции в IRvm IRV, чтобы выполнить некоторую проверку переполнения целых чисел (IO). Однако меня раздражает, что некоторые из моих вставленных инструкций оптимизируются оптимизатором.

Например, когда есть

int result = data + 1;

Мой пропуск будет рассматривать эту операцию как потенциальный сайт переполнения и добавит (IR, конечно, я написал C здесь, чтобы облегчить мою жизнь):

int64_t result_64bit = (int64_t)data + 1
if (result_64bit > 2147483647) { report(); }

Однако эта инструкция оптимизирована.

Вот что я попробовал:

добавить флаг -O0. Это не сработает. Я сбрасывал IR после каждого прохода, и это происходило на проходе. Удалить избыточную операцию. (Не избыточно с моей точки зрения ...)

Переместить проход в конец оптимизации, установив флаг EP_OptimizerLast. Ну, это не оптимально, так как некоторая информация теряется. Например, я сильно полагаюсь на флаг nsw / nuw для определения признаков, некоторые из этих флагов удаляются после оптимизации.

Итак, что я спрашиваю, есть ли в LLVM какой-то механизм защиты инструкций, который защищает инструкцию от оптимизации или удаления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...