什么GHC优化负责复制案例表达式?
给出以下代码:
{-# OPTIONS_GHC -funbox-strict-fields #-}
module Test where
data X = X !Int !Int
test (X a b) (X c d) = X (max a c) (max b d)
GHC在进行优化编译时生成此核心(重命名以便于阅读):
test
test =
u v ->
case u of x { X y z ->
case v of c { X d e ->
case tagToEnum# (<=# y d) of _ {
False ->
case tagToEnum# (<=# z e) of _ {
False -> x;
True -> X y e
};
True ->
case tagToEnum# (<=# z e) of _ {
False -> X d z;
True -> c
}
}
}
}
注意GHC如何在总共4种不同的代码路径中生成。 通常,代码路径的数量随着条件的数量呈指数增长。
什么GHC优化导致了这种行为? 有没有一个标志来控制这种优化? 在我的情况下,这会产生巨大的代码膨胀,并且由于深度嵌套的case表达式而使得核心转储非常难以阅读。
经过一番研究后,我发现负责这项工作的优化就是所谓的“案例”转换,GHC大概是在简化器中进行的,所以它不能被停用(因为它需要大量的GHC和简化器是GHC优化流程的一个组成部分)。
以下链接解释了案例如何导致重复:http://lambda.jstolarek.com/2013/01/taking-magic-out-of-ghc-or-tracing-compilation-by-transformation/
特别是,案例变成这样:
case (
case C of
B1 -> F1
B2 -> F2
) of
A1 -> E1
A2 -> E2
分成以下几部分:
case C of
B1 -> case F1 of
A1 -> E1
A2 -> E2
B2 -> case F2 of
A1 -> E1
A2 -> E2
外壳被复制并推入分支。
链接地址: http://www.djcxy.com/p/90463.html上一篇: What GHC optimization is responsible for duplicating case expressions?
下一篇: How to increase margins around a word except at the edges of a line