Я вставляю некоторые инструкции в 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 какой-то механизм защиты инструкций, который защищает инструкцию от оптимизации или удаления?