opt_D_dump_stg,
opt_D_dump_stranal,
opt_D_dump_tc,
+ opt_D_dump_types,
opt_D_dump_usagesp,
opt_D_dump_worker_wrapper,
opt_D_show_passes,
opt_D_dump_rn_trace,
opt_D_dump_rn_stats,
opt_D_dump_stix,
+ opt_D_dump_minimal_imports,
opt_D_source_stats,
opt_D_verbose_core2core,
opt_D_verbose_stg2stg,
opt_UF_KeenessFactor,
opt_UF_CheapOp,
opt_UF_DearOp,
- opt_UF_NoRepLit,
-- misc opts
- opt_CompilingPrelude,
+ opt_InPackage,
opt_EmitCExternDecls,
opt_EnsureSplittableC,
opt_GranMacros,
opt_NoImplicitPrelude,
opt_OmitBlackHoling,
opt_OmitInterfacePragmas,
- opt_ProduceC,
opt_ProduceExportCStubs,
opt_ProduceExportHStubs,
- opt_ProduceHi,
- opt_ProduceS,
+ opt_HiFile,
+ opt_HiDir,
+ opt_HiSuf,
+ opt_NoPruneTyDecls,
opt_NoPruneDecls,
opt_ReportCompile,
opt_SourceUnchanged,
opt_Unregisterised,
opt_Verbose,
+ opt_OutputLanguage,
+ opt_OutputFile,
+
-- Code generation
opt_UseVanillaRegs,
opt_UseFloatRegs,
-- Each run of the simplifier can take a different
-- set of simplifier-specific flags.
| CoreDoFloatInwards
- | CoreDoFullLaziness
+ | CoreDoFloatOutwards Bool -- True <=> float lambdas to top level
| CoreLiberateCase
| CoreDoPrintCore
| CoreDoStaticArgs
\begin{code}
data StgToDo
= StgDoStaticArgs
- | StgDoUpdateAnalysis
| StgDoLambdaLift
| StgDoMassageForProfiling -- should be (next to) last
-- There's also setStgVarInfo, but its absolute "lastness"
= MaxSimplifierIterations Int
| SimplInlinePhase Int
| DontApplyRules
+ | NoCaseOfCase
| SimplLetToCase
\end{code}
opt_D_dump_stg = opt_D_dump_most || lookUp SLIT("-ddump-stg")
opt_D_dump_stranal = opt_D_dump_most || lookUp SLIT("-ddump-stranal")
opt_D_dump_tc = opt_D_dump_most || lookUp SLIT("-ddump-tc")
+opt_D_dump_types = opt_D_dump_most || lookUp SLIT("-ddump-types")
opt_D_dump_rules = opt_D_dump_most || lookUp SLIT("-ddump-rules")
opt_D_dump_usagesp = opt_D_dump_most || lookUp SLIT("-ddump-usagesp")
opt_D_dump_cse = opt_D_dump_most || lookUp SLIT("-ddump-cse")
opt_D_source_stats = opt_D_dump_most || lookUp SLIT("-dsource-stats")
opt_D_verbose_core2core = opt_D_dump_all || lookUp SLIT("-dverbose-simpl")
opt_D_verbose_stg2stg = opt_D_dump_all || lookUp SLIT("-dverbose-stg")
+opt_D_dump_minimal_imports = lookUp SLIT("-ddump-minimal-imports")
opt_DoCoreLinting = lookUp SLIT("-dcore-lint")
opt_DoStgLinting = lookUp SLIT("-dstg-lint")
opt_UsageSPOn = lookUp SLIT("-fusagesp-on")
opt_UnboxStrictFields = lookUp SLIT("-funbox-strict-fields")
- {-
- It's a bit unfortunate to have to re-introduce this chap, but on Win32
- platforms we do need a way of distinguishing between the case when we're
- compiling a static version of the Prelude and one that's going to be
- put into a DLL. Why? Because the compiler's wired in modules need to
- be attributed as either coming from a DLL or not.
- -}
-opt_CompilingPrelude = lookUp SLIT("-fcompiling-prelude")
+{-
+ The optional '-inpackage=P' flag tells what package
+ we are compiling this module for.
+ The Prelude, for example is compiled with '-package prelude'
+-}
+opt_InPackage = case lookup_str "-inpackage=" of
+ Just p -> _PK_ p
+ Nothing -> SLIT("Main") -- The package name if none is specified
+
opt_EmitCExternDecls = lookUp SLIT("-femit-extern-decls")
opt_EnsureSplittableC = lookUp SLIT("-fglobalise-toplev-names")
opt_GranMacros = lookUp SLIT("-fgransim")
opt_NoImplicitPrelude = lookUp SLIT("-fno-implicit-prelude")
opt_OmitBlackHoling = lookUp SLIT("-dno-black-holing")
opt_OmitInterfacePragmas = lookUp SLIT("-fomit-interface-pragmas")
-opt_ProduceC = lookup_str "-C="
opt_ProduceExportCStubs = lookup_str "-F="
opt_ProduceExportHStubs = lookup_str "-FH="
-opt_ProduceHi = lookup_str "-hifile=" -- the one to produce this time
+
+-- where to generate the .hi file
+opt_HiFile = lookup_str "-hifile="
+opt_HiDir = lookup_str "-hidir="
+opt_HiSuf = lookup_str "-hisuf="
+
+-- Language for output: "C", "asm", "java", maybe more
+-- Nothing => don't output anything
+opt_OutputLanguage :: Maybe String
+opt_OutputLanguage = lookup_str "-olang="
+
+opt_OutputFile :: String
+opt_OutputFile = case lookup_str "-ofile=" of
+ Nothing -> panic "No output file specified (-ofile=xxx)"
+ Just f -> f
-- Simplifier switches
opt_SimplNoPreInlining = lookUp SLIT("-fno-pre-inlining")
opt_SimplPedanticBottoms = lookUp SLIT("-fpedantic-bottoms")
-- Unfolding control
-opt_UF_HiFileThreshold = lookup_def_int "-funfolding-interface-threshold" (30::Int)
-opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (30::Int)
+opt_UF_HiFileThreshold = lookup_def_int "-funfolding-interface-threshold" (45::Int)
+opt_UF_CreationThreshold = lookup_def_int "-funfolding-creation-threshold" (45::Int)
opt_UF_UseThreshold = lookup_def_int "-funfolding-use-threshold" (8::Int) -- Discounts can be big
opt_UF_ScrutConDiscount = lookup_def_int "-funfolding-con-discount" (2::Int)
opt_UF_FunAppDiscount = lookup_def_int "-funfolding-fun-discount" (6::Int) -- It's great to inline a fn
opt_UF_PrimArgDiscount = lookup_def_int "-funfolding-prim-discount" (1::Int)
-opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (2.0::Float)
+opt_UF_KeenessFactor = lookup_def_float "-funfolding-keeness-factor" (1.5::Float)
-opt_UF_CheapOp = ( 0 :: Int) -- Only one instruction; and the args are charged for
+opt_UF_CheapOp = ( 1 :: Int) -- Only one instruction; and the args are charged for
opt_UF_DearOp = ( 4 :: Int)
-opt_UF_NoRepLit = ( 20 :: Int) -- Strings can be pretty big
-opt_ProduceS = lookup_str "-S="
opt_ReportCompile = lookUp SLIT("-freport-compile")
opt_NoPruneDecls = lookUp SLIT("-fno-prune-decls")
+opt_NoPruneTyDecls = lookUp SLIT("-fno-prune-tydecls")
opt_SourceUnchanged = lookUp SLIT("-fsource-unchanged")
opt_Static = lookUp SLIT("-static")
opt_Unregisterised = lookUp SLIT("-funregisterised")
simpl_sep opts defaultSimplSwitches core_td stg_td
"-ffloat-inwards" -> CORE_TD(CoreDoFloatInwards)
- "-ffull-laziness" -> CORE_TD(CoreDoFullLaziness)
+ "-ffloat-outwards" -> CORE_TD(CoreDoFloatOutwards False)
+ "-ffloat-outwards-full" -> CORE_TD(CoreDoFloatOutwards True)
"-fliberate-case" -> CORE_TD(CoreLiberateCase)
"-fcse" -> CORE_TD(CoreCSE)
"-fprint-core" -> CORE_TD(CoreDoPrintCore)
"-fcpr-analyse" -> CORE_TD(CoreDoCPResult)
"-fstg-static-args" -> STG_TD(StgDoStaticArgs)
- "-fupdate-analysis" -> STG_TD(StgDoUpdateAnalysis)
"-dstg-stats" -> STG_TD(D_stg_stats)
"-flambda-lift" -> STG_TD(StgDoLambdaLift)
"-fmassage-stg-for-profiling" -> STG_TD(StgDoMassageForProfiling)
= firstJust [ matchSwInt opt "-fmax-simplifier-iterations" MaxSimplifierIterations
, matchSwInt opt "-finline-phase" SimplInlinePhase
, matchSwBool opt "-fno-rules" DontApplyRules
+ , matchSwBool opt "-fno-case-of-case" NoCaseOfCase
, matchSwBool opt "-flet-to-case" SimplLetToCase
]
tagOf_SimplSwitch (MaxSimplifierIterations _) = ILIT(2)
tagOf_SimplSwitch DontApplyRules = ILIT(3)
tagOf_SimplSwitch SimplLetToCase = ILIT(4)
+tagOf_SimplSwitch NoCaseOfCase = ILIT(5)
-- If you add anything here, be sure to change lAST_SIMPL_SWITCH_TAG, too!
-lAST_SIMPL_SWITCH_TAG = 4
+lAST_SIMPL_SWITCH_TAG = 5
\end{code}
%************************************************************************