[英]What GHC optimization is responsible for duplicating case expressions?
給出以下代碼:
{-# 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
外殼被復制並推入分支的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.