使用GHC API编译优化程序

问题描述 投票:7回答:1

我想将Haskell模块编译为GHC Core,并应用优化,并使用生成的核心输出。但是,当我使用compileToCoreSimplified时,它似乎没有运行所有正常的优化。参加该计划:

{-# OPTIONS_GHC -O2 #-}
module LensOpt(pick) where
import Control.Lens
data Record = Record {_field :: String}
field = lens _field $ \r x -> r{_field=x}
pick = Record "test" ^. field

当通过ghc -ddump-simple运行时,我得到了最佳输出:

LensOpt.pick1 :: GHC.Prim.Addr#
LensOpt.pick1 = "test"#

pick :: String
pick = GHC.CString.unpackCString# LensOpt.pick1

但是,当使用compileToCoreSimplified编译时,我得到输出:

s1 :: Addr#
s1 = "test"#

s2 :: [Char]
s2 = unpackCString# s1

s3 :: Record
s3 = Record s2

pick :: String
pick = case s3 of { Record ds -> ds }

我正在调用compileToCoreSimplified

import GHC
import GhcPlugins
import GHC.Paths

main = runGhc (Just libdir) $ do
    setTargets []
    dflags <- getSessionDynFlags
    setSessionDynFlags dflags{hscTarget = HscNothing}
    res <- compileToCoreSimplified "LensOpt.hs"
    liftIO $ writeFile "lens_api.txt" $ showSDoc dflags $ ppr res

如何驱动GHC API以应用完整优化?

haskell ghc ghc-api
1个回答
1
投票

您需要打开要在DynFlags中运行的优化。

您可以通过指定优化级别(0..2)和基于该优化级别(updOptLevel)设置优化,或打开单个优化(如Opt_Specialise)来实现此目的:

main = runGhc (Just libdir) $ do
    setTargets []
    dflags <- getSessionDynFlags
    setSessionDynFlags $ updOptLevel 2 $ dflags{hscTarget = HscNothing}
© www.soinside.com 2019 - 2024. All rights reserved.