Clang互惠1次优化

时间:2015-09-21 13:43:26

标签: c optimization clang

在与同事讨论之后,如果clang将两个部门优化为1,则我最终会测试到一个部门。

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

如果const float y = b / a仅用作临时步骤值,那么理论上的clang可以优化为x吗?

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

这个相关的问题是我理解的背后,似乎只关注为什么没有使用特定的指令,而在我的情况下它是没有完成的优化:{{3 }}

谢谢, JB。

2 个答案:

答案 0 :(得分:4)

不,铿锵不能那样做。

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

浮点运算中的

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

  1. 除以b
  2. 将结果舍入到最近的浮点数
  3. 除以结果
  4. 将结果舍入到最近的浮点数。
  5. 在第二种情况下:

    1. 将b除以a。
    2. 将结果舍入到最近的浮点数。
    3. 如果结果保证相同,编译器只能更改代码,如果编译器编写器无法生成结果相同的数学证明,则编译器无法更改代码。在第一种情况下有两个舍入操作,舍入不同的数字,因此不可能保证结果相同。

答案 1 :(得分:1)

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

这样的事情可能是通过优化编译器"思维":

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

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