[英]Optimization flags cause incorrect computation
我有一个奇怪的优化错误,所以我试图确定哪个标志导致它。 使用-O1
时会发生错误(计算错误),但不会使用-O0
。 因此,我认为我可以使用-O1 includes to narrow down the culprit
所有-f flags
-O1 includes to narrow down the culprit
。 但是,当我尝试(使用此列表http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html )时,它再次正常工作!
任何人都可以解释这一点,或提供其他建议寻找什么? 我通过valgrind
运行代码,它不会报告任何错误。
我发现的计算是正确的用-O0
,不正确用-O1
,但正确再次与-O1 -ffloat-store
。 如果没有-ffloat-store
,任何关于如何寻找的想法都会导致它无法工作?
如果我使用正常释放标志进行编译,则会出现计算错误。 但是,如果我添加:
-ffloat-store
要么
-mpc64
到标志列表,错误就消失了。
任何人都可以建议一种方法来追踪这个标志产生差异的线,这样我就可以改变它,而不是要求每个人使用代码来编译一个额外的标志?
从我的GCC / C ++时代开始,我记得的这样的优化错误就是在没有指定返回值的方法上使用-O0
将返回该方法中该类型的最后一个值(可能是你想要返回的那个?)而对其进行优化则返回了类型的默认值,而不是方法中类型的最后一个值(这可能只适用于值类型,我不记得了)。 这意味着你会在调试标志开启的情况下开发多年,一切看起来都很好,然后在你优化时就会停止工作。
对我来说,没有指定返回值是一个编译错误,但那时就是C ++。
对此的解决方案是打开最强的警告集,然后将所有警告视为错误:这将突出显示这样的事情。 (如果你还没有这样做,那么你会感到痛苦!)
如果您已经拥有所有错误/警告,那么唯一的另一个选择是正在优化带有副作用的方法调用。 这将更难追查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.