{-# LANGUAGE CPP #-}
module Polysemy.Plugin.Phases
( extraPhases
) where
import BasicTypes
import CoreMonad
import DynFlags
extraPhases :: DynFlags -> [CoreToDo]
extraPhases dflags =
[ CoreDoSpecialising
, simpl_phase 0 ["post-late-spec"] max_iter
, simpl_gently
, CoreDoStaticArgs
, CoreDoSpecialising
, simpl_phase 0 ["post-late-spec"] max_iter
, simpl_phases
, simpl_gently
]
where
option = flip gopt dflags
max_iter = maxSimplIterations dflags
rules_on = option Opt_DoLambdaEtaExpansion
phases = simplPhases dflags
base_mode = SimplMode
{ sm_phase = error "base_mode"
, sm_names = []
#if __GLASGOW_HASKELL__ >= 804
, sm_dflags = dflags
#endif
, sm_rules = option Opt_EnableRewriteRules
, sm_eta_expand = rules_on
, sm_inline = True
, sm_case_case = True
}
simpl_phase phase names iter = CoreDoPasses
[ runWhen (phase `elem` strictnessBefore dflags) CoreDoStrictness
, CoreDoSimplify iter $
base_mode { sm_phase = Phase phase
, sm_names = names
}
, runMaybe (ruleCheck dflags) $ CoreDoRuleCheck $ Phase phase
]
simpl_gently = CoreDoSimplify max_iter $ base_mode
{ sm_phase = InitialPhase
, sm_names = ["Gentle"]
, sm_rules = rules_on
, sm_inline = True
, sm_case_case = False
}
simpl_phases = CoreDoPasses
[ simpl_phase phase ["main"] max_iter
| phase <- [phases, phases-1 .. 1]
]