rit*_*mon 1 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)
Run Code Online (Sandbox Code Playgroud)
有多个相同的子表达式。我如何在不阅读核心的情况下判断是否正在发生公共子表达式消除以及其中的哪些部分?
使用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
Run Code Online (Sandbox Code Playgroud)
与此编译-O2或-O3同时显示了ans1与ans2在表明GHC没有执行CSE跟踪输出。如果tr1在两个地方都使用,您会得到类似的结果。
Haskell Wiki 提到 GHC 仅在有限的情况下执行 CSE - (链接) - 如果您想确保它发生,建议您自己执行。