如何判断GHC中是否发生了常见的子表达式消除?

时间:2016-08-29 14:37:31

标签: haskell ghc compiler-optimization

假设我有一个天真实现的功能:

quadratic a b c = (ans1, ans2)
  where
    ans1 = ((-b) + sqrt (b * b - 4 * a * c)) / (2 * a)
    ans2 = ((-b) - sqrt (b * b - 4 * a * c)) / (2 * a)

有多个相同的子表达式。如果没有阅读核心,我怎么能告诉我们是否发生了常见的子表达式消除以及这个部分是什么?

1 个答案:

答案 0 :(得分:4)

使用trace可能会告诉您this SO question中的演示。

import Debug.Trace

quadratic a b c = (ans1, ans2)
  where
    ans1 = ((-b) + tr1 (sqrt (b * b - 4 * a * c))) / (2 * a)
    ans2 = ((-b) - tr2 (sqrt (b * b - 4 * a * c))) / (2 * a)
    tr1 = trace "ans1"
    tr2 = trace "ans2"

main = print $ quadratic 1 10 3

使用-O2-O3进行编译会在跟踪输出中显示ans1ans2,表明GHC未执行CSE。你得到类似的 如果您在两个地方都使用tr1,则会产生结果。

Haskell Wiki提到GHC仅在有限的情况下执行CSE 环境 - (link) - 并建议您执行 如果你想确保它发生,你自己。