Clang互惠1次优化

在与同事讨论之后,我最终测试了是否clang如果将两个分区(相当于1)优化为单个分​​区。

const float x = a / b; //x not used elsewhere const float y = 1 / x;

理论上clang可以优化到const float y = b / a如果x仅用作临时步长值,不是吗?

这是一个简单测试用例的输入和输出: https : //gist.github.com/Jiboo/d6e839084841d39e5ab6 (在两个输出中你可以看到它正在执行两个部分,而不是优化)

这个相关的问题是我理解的背后,似乎只关注为什么没有使用特定的指令,而在我的情况下,它是未完成的优化: 为什么GCC或Clang在快速使用时不能优化1指令的倒数-数学

谢谢,JB。

不,铿锵不能那样做。

但首先,你为什么要使用浮动? float有六位精度,double有15位。除非你有充分的理由,你可以解释一下,使用double。

浮点运算中的1 /(a / b)与b / a不同。 编译器必须做的是第一种情况:

  1. 除以b
  2. 将结果舍入到最近的浮点数
  3. 除以结果1
  4. 将结果舍入到最近的浮点数。

在第二种情况:

  1. 将b除以a。
  2. 将结果舍入到最近的浮点数。

如果结果保证相同,编译器只能更改代码,如果编译器编写器无法生成结果相同的数学certificate,则编译器无法更改代码。 在第一种情况下有两个舍入操作,舍入不同的数字,因此不可能保证结果相同。

编译器不像数学家那样思考。 如果你认为简化表达式在数学上是微不足道的,那么编译器还有很多其他需要考虑的事情。 实际上,编译器很可能比程序员更聪明,而且对C标准的了解也更多。

像这样的东西可能是通过优化编译器的“思想”:

  • 啊他们写a / b但只在一个地方使用x ,所以我们不必在堆栈上分配该变量。 我将删除它并使用CPU寄存器。
  • 嗯,整数字面值1除以浮点变量。 好的,我们必须先调用此处的平衡,然后将该文字转换为float 1.0f
  • 程序员指望我生成代码,其中包含将1.0f除以另一个浮点变量所涉及的潜在浮点不准确性! 所以我不能只用b / a交换这个表达式,因为那时程序员似乎想要的那个浮点不准确就会丢失。

等等。 有很多考虑因素。 你最终得到的机器代码很难提前预测。 只要知道编译器遵循你的指示信。