簡體   English   中英

什么GHC優化負責復制案例表達?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM