gpt4 book ai didi

haskell - 哪种 GHC 优化会导致重复的 case 表达式?

转载 作者:行者123 更新时间:2023-12-02 05:41:03 24 4
gpt4 key购买 nike

给出以下代码:

{-# 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 表达式而使核心转储非常难以阅读。

最佳答案

经过一些研究,我发现造成这种情况的优化是所谓的“case-of-case”转换,GHC 大概是在简化器中执行的,所以它不能被停用(因为它对于GHC 所做的很多事情,并且简化器是 GHC 优化管道不可或缺的一部分)。

以下链接解释了 case of case 如何导致重复: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

外壳已被复制并插入分支。

关于haskell - 哪种 GHC 优化会导致重复的 case 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35815503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com