我正在llvm IR中插入一些指令以进行一些Integer Overflow(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中是否存在某种指令保护措施,以防止指令被优化或删除?