【发布时间】:2016-06-19 08:04:33
【问题描述】:
给定以下代码:
{-# 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 表达式使得核心转储非常难以阅读。
【问题讨论】:
-
您是否 100% 确定这是一种优化?我一直认为 Core 的
case语句仅限于一次执行一个模式匹配,因此在处理定义中的多个模式时,这种嵌套的cases 是必要的。 -
哦,嗯,我发誓它在没有优化的情况下生成了其他东西。但现在我试图重现,它不再。让我检查一下……
标签: haskell optimization ghc