Использование GHC API для компиляции программы с оптимизацией

Я хочу скомпилировать модуль 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 применить полную оптимизацию?


person Neil Mitchell    schedule 20.06.2018    source источник


Ответы (1)


Вам нужно включить оптимизацию, которую вы хотите запустить в файле DynFlags.

Вы можете сделать это, указав уровень оптимизации (0..2) и настроив оптимизацию на его основе (updOptLevel) или путем включения отдельных оптимизаций, таких как Opt_Specialise:

main = runGhc (Just libdir) $ do
    setTargets []
    dflags <- getSessionDynFlags
    setSessionDynFlags $ updOptLevel 2 $ dflags{hscTarget = HscNothing}
person Cactus    schedule 15.02.2019