[project @ 1999-06-23 10:33:03 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / CmdLineOpts.lhs
index 62b2e34..8652480 100644 (file)
@@ -1,11 +1,9 @@
 %
-% (c) The AQUA Project, Glasgow University, 1996
+% (c) The AQUA Project, Glasgow University, 1996-98
 %
 \section[CmdLineOpts]{Things to do with command-line options}
 
 \begin{code}
-#include "HsVersions.h"
-
 module CmdLineOpts (
        CoreToDo(..),
        SimplifierSwitch(..),
@@ -16,112 +14,159 @@ module CmdLineOpts (
        intSwitchSet,
        switchIsOn,
 
-       maybe_CompilingGhcInternals,
-       opt_AllStrict,
-       opt_AutoSccsOnAllToplevs,
-       opt_AutoSccsOnExportedToplevs,
-       opt_AutoSccsOnIndividualCafs,
-       opt_CompilingGhcInternals,
+       src_filename,
+
+       -- debugging opts
        opt_D_dump_absC,
        opt_D_dump_asm,
+       opt_D_dump_cpranal,
+       opt_D_dump_cse,
        opt_D_dump_deriv,
        opt_D_dump_ds,
        opt_D_dump_flatC,
+       opt_D_dump_foreign,
+       opt_D_dump_inlinings,
        opt_D_dump_occur_anal,
-       opt_D_dump_rdr,
+       opt_D_dump_parsed,
        opt_D_dump_realC,
        opt_D_dump_rn,
+       opt_D_dump_rules,
        opt_D_dump_simpl,
        opt_D_dump_simpl_iterations,
+       opt_D_dump_simpl_stats,
        opt_D_dump_spec,
        opt_D_dump_stg,
        opt_D_dump_stranal,
        opt_D_dump_tc,
+        opt_D_dump_usagesp,
+       opt_D_dump_worker_wrapper,
        opt_D_show_passes,
-       opt_D_show_rn_trace,
-       opt_D_simplifier_stats,
+       opt_D_dump_rn_trace,
+       opt_D_dump_rn_stats,
        opt_D_source_stats,
        opt_D_verbose_core2core,
        opt_D_verbose_stg2stg,
        opt_DoCoreLinting,
        opt_DoStgLinting,
-       opt_DoSemiTagging,
-       opt_DoEtaReduction,
+        opt_DoUSPLinting,
+       opt_PprStyle_Debug,
+       opt_PprStyle_NoPrags,
+       opt_PprUserLength,
+
+       -- warning opts
+       opt_WarnDuplicateExports,
+       opt_WarnHiShadows,
+       opt_WarnIncompletePatterns,
+       opt_WarnMissingMethods,
+       opt_WarnMissingSigs,
+       opt_WarnNameShadowing,
+       opt_WarnOverlappingPatterns,
+       opt_WarnSimplePatterns,
+       opt_WarnTypeDefaults,
+       opt_WarnUnusedBinds,
+       opt_WarnUnusedImports,
+       opt_WarnUnusedMatches,
+
+       -- profiling opts
+       opt_AutoSccsOnAllToplevs,
+       opt_AutoSccsOnExportedToplevs,
+       opt_AutoSccsOnIndividualCafs,
+       opt_AutoSccsOnDicts,
+       opt_SccGroup,
+       opt_SccProfilingOn,
        opt_DoTickyProfiling,
-       opt_EnsureSplittableC,
-       opt_FoldrBuildOn,
-       opt_ForConcurrent,
+
+       -- language opts
+       opt_AllStrict,
+       opt_DictsStrict,
+        opt_MaxContextReductionDepth,
+        opt_AllowOverlappingInstances,
+       opt_AllowUndecidableInstances,
        opt_GlasgowExts,
+       opt_IrrefutableTuples,
+       opt_NumbersStrict,
+       opt_Parallel,
+
+       -- optimisation opts
+       opt_DoEtaReduction,
+       opt_DoSemiTagging,
+       opt_FoldrBuildOn,
+       opt_LiberateCaseThreshold,
+       opt_NoPreInlining,
+       opt_StgDoLetNoEscapes,
+       opt_UnfoldCasms,
+        opt_UsageSPOn,
+       opt_UnboxStrictFields,
+       opt_SimplNoPreInlining,
+       opt_SimplDoEtaReduction,
+       opt_SimplDoCaseElim,
+       opt_SimplDoLambdaEtaExpansion,
+       opt_SimplCaseOfCase,
+       opt_SimplCaseMerge,
+       opt_SimplLetToCase,
+       opt_SimplPedanticBottoms,
+
+       -- Unfolding control
+       opt_UF_HiFileThreshold,
+       opt_UF_CreationThreshold,
+       opt_UF_UseThreshold,
+       opt_UF_ScrutConDiscount,
+       opt_UF_FunAppDiscount,
+       opt_UF_PrimArgDiscount,
+       opt_UF_KeenessFactor,
+       opt_UF_CheapOp,
+       opt_UF_DearOp,
+       opt_UF_NoRepLit,
+
+       -- misc opts
+       opt_CompilingPrelude,
+       opt_EmitCExternDecls,
+       opt_EnsureSplittableC,
        opt_GranMacros,
        opt_HiMap,
+       opt_HiVersion,
+       opt_HistorySize,
+       opt_IgnoreAsserts,
        opt_IgnoreIfacePragmas,
-       opt_IrrefutableTuples,
-       opt_LiberateCaseThreshold,
+        opt_NoHiCheck,
        opt_NoImplicitPrelude,
-       opt_NumbersStrict,
        opt_OmitBlackHoling,
        opt_OmitInterfacePragmas,
-       opt_PprStyle_All,
-       opt_PprStyle_Debug,
-       opt_PprStyle_User,              -- ToDo: rm
-       opt_PprUserLength,
        opt_ProduceC,
+       opt_ProduceExportCStubs,
+       opt_ProduceExportHStubs,
        opt_ProduceHi,
        opt_ProduceS,
-       opt_ReportWhyUnfoldingsDisallowed,
-       opt_ReturnInRegsThreshold,
-       opt_SccGroup,
-       opt_SccProfilingOn,
-       opt_ShowImportSpecs,
-       opt_SigsRequired,
+       opt_NoPruneDecls,
+       opt_ReportCompile,
        opt_SourceUnchanged,
-       opt_SpecialiseAll,
-       opt_SpecialiseImports,
-       opt_SpecialiseOverloaded,
-       opt_SpecialiseTrace,
-       opt_SpecialiseUnboxed,
-       opt_StgDoLetNoEscapes,
-
-       opt_InterfaceUnfoldThreshold,
-       opt_UnfoldingCreationThreshold,
-       opt_UnfoldingConDiscount,
-       opt_UnfoldingUseThreshold,
-       opt_UnfoldingKeenessFactor,
-
+       opt_Static,
+       opt_Unregisterised,
        opt_Verbose,
-       opt_WarnNameShadowing,
-       opt_WarnUnusedNames,
-       opt_WarnIncompletePatterns, opt_WarnOverlappedPatterns,
-       opt_WarnMissingMethods,
-       opt_WarnDuplicateExports,
-       opt_PruneTyDecls, opt_PruneInstDecls,
-       opt_D_show_unused_imports,
-       opt_D_show_rn_stats,
-       
-       all_toplev_ids_visible
-    ) where
 
-IMPORT_1_3(Array(array, (//)))
-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201
-import PreludeGlaST    -- bad bad bad boy, Will (_Array internals)
-#else
-import GlaExts
-import ArrBase
-#if __GLASGOW_HASKELL__ >= 209
-import Addr
-#endif
--- 2.04 and later exports Lift from GlaExts
-#if __GLASGOW_HASKELL__ < 204
-import PrelBase (Lift(..))
-#endif
-#endif
+       -- Code generation
+       opt_UseVanillaRegs,
+       opt_UseFloatRegs,
+       opt_UseDoubleRegs,
+       opt_UseLongRegs
+    ) where
 
-CHK_Ubiq() -- debugging consistency check
+#include "HsVersions.h"
 
+import Array   ( array, (//) )
+import GlaExts
 import Argv
 import Constants       -- Default values for some flags
+
+import FastString      ( headFS )
 import Maybes          ( assocMaybe, firstJust, maybeToBool )
-import Util            ( startsWith, panic, panic#, assertPanic )
+import Panic           ( panic, panic# )
+
+#if __GLASGOW_HASKELL__ < 301
+import ArrBase ( Array(..) )
+#else
+import PrelArr  ( Array(..) )
+#endif
 \end{code}
 
 A command-line {\em switch} is (generally) either on or off; e.g., the
@@ -138,6 +183,7 @@ main loop (\tr{main/Main.lhs}), in the Core-to-Core processing loop
 (\tr{simplCore/SimplCore.lhs), and in the STG-to-STG processing loop
 (\tr{simplStg/SimplStg.lhs}).
 
+
 %************************************************************************
 %*                                                                     *
 \subsection{Datatypes associated with command-line options}
@@ -160,17 +206,17 @@ data CoreToDo             -- These are diff core-to-core passes,
        (SimplifierSwitch -> SwitchResult)
                        -- Each run of the simplifier can take a different
                        -- set of simplifier-specific flags.
-  | CoreDoCalcInlinings1
-  | CoreDoCalcInlinings2
   | CoreDoFloatInwards
   | CoreDoFullLaziness
   | CoreLiberateCase
   | CoreDoPrintCore
   | CoreDoStaticArgs
   | CoreDoStrictness
+  | CoreDoWorkerWrapper
   | CoreDoSpecialising
-  | CoreDoFoldrBuildWorkerWrapper
-  | CoreDoFoldrBuildWWAnal
+  | CoreDoUSPInf
+  | CoreDoCPResult 
+  | CoreCSE
 \end{code}
 
 \begin{code}
@@ -186,57 +232,8 @@ data StgToDo
 
 \begin{code}
 data SimplifierSwitch
-  = SimplOkToDupCode
-  | SimplFloatLetsExposingWHNF
-  | SimplOkToFloatPrimOps
-  | SimplAlwaysFloatLetsFromLets
-  | SimplDoCaseElim
-  | SimplReuseCon
-  | SimplCaseOfCase
-  | SimplLetToCase
-  | SimplMayDeleteConjurableIds
-  | SimplPedanticBottoms -- see Simplifier for an explanation
-  | SimplDoArityExpand  -- expand arity of bindings
-  | SimplDoFoldrBuild   -- This is the per-simplification flag;
-                        -- see also FoldrBuildOn, used elsewhere
-                        -- in the compiler.
-  | SimplDoInlineFoldrBuild
-                        -- inline foldr/build (*after* f/b rule is used)
-
-  | IgnoreINLINEPragma
-  | SimplDoLambdaEtaExpansion
-
-  | EssentialUnfoldingsOnly -- never mind the thresholds, only
-                           -- do unfoldings that *must* be done
-                           -- (to saturate constructors and primitives)
-
-  | ShowSimplifierProgress  -- report counts on every interation
-
-  | MaxSimplifierIterations Int
-
-  | KeepSpecPragmaIds      -- We normally *toss* Ids we can do without
-  | KeepUnusedBindings
-
-  | SimplNoLetFromCase     -- used when turning off floating entirely
-  | SimplNoLetFromApp      -- (for experimentation only) WDP 95/10
-  | SimplNoLetFromStrictLet
-
-  | SimplDontFoldBackAppend
-                       -- we fold `foldr (:)' back into flip (++),
-                       -- but we *don't* want to do it when compiling
-                       -- List.hs, otherwise
-                       -- xs ++ ys = foldr (:) ys xs
-                       -- {- via our loopback -}
-                       -- xs ++ ys = xs ++ ys
-                       -- Oops!
-                       -- So only use this flag inside List.hs
-                       -- (Sigh, what a HACK, Andy.  WDP 96/01)
-
-  | SimplCaseMerge
-  | SimplCaseScrutinee -- This flag tells that the expression being simplified is
-                       -- the scrutinee of a case expression, so we should
-                       -- apply the scrutinee discount when considering inlinings.
-                       -- See SimplVar.lhs
+  = MaxSimplifierIterations Int
+  | SimplInlinePhase Int
 \end{code}
 
 %************************************************************************
@@ -270,22 +267,45 @@ lookup_def_float sw def = case (lookup_str sw) of
 
 assoc_opts    = assocMaybe [ (a, True) | a <- argv ]
 unpacked_opts = map _UNPK_ argv
+
+{-
+ Putting the compiler options into temporary at-files
+ may turn out to be necessary later on if we turn hsc into
+ a pure Win32 application where I think there's a command-line
+ length limit of 255. unpacked_opts understands the @ option.
+
+assoc_opts    = assocMaybe [ (_PK_ a, True) | a <- unpacked_opts ]
+
+unpacked_opts :: [String]
+unpacked_opts =
+  concat $
+  map (expandAts) $
+  map _UNPK_ argv
+  where
+   expandAts ('@':fname) = words (unsafePerformIO (readFile fname))
+   expandAts l = [l]
+-}
 \end{code}
 
 \begin{code}
-opt_AllStrict                  = lookUp  SLIT("-fall-strict")
-opt_AutoSccsOnAllToplevs       = lookUp  SLIT("-fauto-sccs-on-all-toplevs")
-opt_AutoSccsOnExportedToplevs  = lookUp  SLIT("-fauto-sccs-on-exported-toplevs")
-opt_AutoSccsOnIndividualCafs   = lookUp  SLIT("-fauto-sccs-on-individual-cafs")
-opt_CompilingGhcInternals      = maybeToBool maybe_CompilingGhcInternals
-maybe_CompilingGhcInternals    = lookup_str "-fcompiling-ghc-internals="
+src_filename :: FAST_STRING
+src_filename = case argv of
+                 filename : rest | headFS filename /= '-' -> filename
+                 otherwise -> panic "no filename"
+\end{code}
+
+\begin{code}
+-- debugging opts
 opt_D_dump_absC                        = lookUp  SLIT("-ddump-absC")
 opt_D_dump_asm                 = lookUp  SLIT("-ddump-asm")
+opt_D_dump_cpranal             = lookUp  SLIT("-ddump-cpranalyse")
 opt_D_dump_deriv               = lookUp  SLIT("-ddump-deriv")
 opt_D_dump_ds                  = lookUp  SLIT("-ddump-ds")
 opt_D_dump_flatC               = lookUp  SLIT("-ddump-flatC")
+opt_D_dump_foreign             = lookUp  SLIT("-ddump-foreign-stubs")
+opt_D_dump_inlinings           = lookUp  SLIT("-ddump-inlinings")
 opt_D_dump_occur_anal          = lookUp  SLIT("-ddump-occur-anal")
-opt_D_dump_rdr                 = lookUp  SLIT("-ddump-rdr")
+opt_D_dump_parsed              = lookUp  SLIT("-ddump-parsed")
 opt_D_dump_realC               = lookUp  SLIT("-ddump-realC")
 opt_D_dump_rn                  = lookUp  SLIT("-ddump-rn")
 opt_D_dump_simpl               = lookUp  SLIT("-ddump-simpl")
@@ -294,95 +314,144 @@ opt_D_dump_spec                  = lookUp  SLIT("-ddump-spec")
 opt_D_dump_stg                 = lookUp  SLIT("-ddump-stg")
 opt_D_dump_stranal             = lookUp  SLIT("-ddump-stranal")
 opt_D_dump_tc                  = lookUp  SLIT("-ddump-tc")
+opt_D_dump_rules               = lookUp  SLIT("-ddump-rules")
+opt_D_dump_usagesp              = lookUp  SLIT("-ddump-usagesp")
+opt_D_dump_cse                         = lookUp  SLIT("-ddump-cse")
+opt_D_dump_worker_wrapper      = lookUp  SLIT("-ddump-workwrap")
 opt_D_show_passes              = lookUp  SLIT("-dshow-passes")
-opt_D_show_rn_trace            = lookUp  SLIT("-dshow-rn-trace")
-opt_D_simplifier_stats         = lookUp  SLIT("-dsimplifier-stats")
+opt_D_dump_rn_trace            = lookUp  SLIT("-ddump-rn-trace")
+opt_D_dump_rn_stats            = lookUp  SLIT("-ddump-rn-stats")
+opt_D_dump_simpl_stats         = lookUp  SLIT("-ddump-simpl-stats")
 opt_D_source_stats             = lookUp  SLIT("-dsource-stats")
 opt_D_verbose_core2core                = lookUp  SLIT("-dverbose-simpl")
 opt_D_verbose_stg2stg          = lookUp  SLIT("-dverbose-stg")
 opt_DoCoreLinting              = lookUp  SLIT("-dcore-lint")
 opt_DoStgLinting               = lookUp  SLIT("-dstg-lint")
-opt_DoSemiTagging              = lookUp  SLIT("-fsemi-tagging")
+opt_DoUSPLinting               = lookUp  SLIT("-dusagesp-lint")
+opt_PprStyle_NoPrags           = lookUp  SLIT("-dppr-noprags")
+opt_PprStyle_Debug             = lookUp  SLIT("-dppr-debug")
+opt_PprUserLength              = lookup_def_int "-dppr-user-length" 5 --ToDo: give this a name
+
+-- warning opts
+opt_WarnDuplicateExports       = lookUp  SLIT("-fwarn-duplicate-exports")
+opt_WarnHiShadows              = lookUp  SLIT("-fwarn-hi-shadowing")
+opt_WarnIncompletePatterns     = lookUp  SLIT("-fwarn-incomplete-patterns")
+opt_WarnMissingMethods         = lookUp  SLIT("-fwarn-missing-methods")
+opt_WarnMissingSigs            = lookUp  SLIT("-fwarn-missing-signatures")
+opt_WarnNameShadowing          = lookUp  SLIT("-fwarn-name-shadowing")
+opt_WarnOverlappingPatterns    = lookUp  SLIT("-fwarn-overlapping-patterns")
+opt_WarnSimplePatterns         = lookUp  SLIT("-fwarn-simple-patterns")
+opt_WarnTypeDefaults           = lookUp  SLIT("-fwarn-type-defaults")
+opt_WarnUnusedBinds            = lookUp  SLIT("-fwarn-unused-binds")
+opt_WarnUnusedImports          = lookUp  SLIT("-fwarn-unused-imports")
+opt_WarnUnusedMatches          = lookUp  SLIT("-fwarn-unused-matches")
+
+-- profiling opts
+opt_AutoSccsOnAllToplevs       = lookUp  SLIT("-fauto-sccs-on-all-toplevs")
+opt_AutoSccsOnExportedToplevs  = lookUp  SLIT("-fauto-sccs-on-exported-toplevs")
+opt_AutoSccsOnIndividualCafs   = lookUp  SLIT("-fauto-sccs-on-individual-cafs")
+opt_AutoSccsOnDicts            = lookUp  SLIT("-fauto-sccs-on-dicts")
+opt_SccGroup                   = lookup_str "-G="
+opt_SccProfilingOn             = lookUp  SLIT("-fscc-profiling")
 opt_DoTickyProfiling           = lookUp  SLIT("-fticky-ticky")
+
+-- language opts
+opt_AllStrict                  = lookUp  SLIT("-fall-strict")
+opt_DictsStrict                        = lookUp  SLIT("-fdicts-strict")
+opt_AllowOverlappingInstances   = lookUp  SLIT("-fallow-overlapping-instances")
+opt_AllowUndecidableInstances  = lookUp  SLIT("-fallow-undecidable-instances")
+opt_GlasgowExts                        = lookUp  SLIT("-fglasgow-exts")
+opt_IrrefutableTuples          = lookUp  SLIT("-firrefutable-tuples")
+opt_MaxContextReductionDepth   = lookup_def_int "-fcontext-stack" mAX_CONTEXT_REDUCTION_DEPTH
+opt_NumbersStrict              = lookUp  SLIT("-fnumbers-strict")
+opt_Parallel                   = lookUp  SLIT("-fparallel")
+
+-- optimisation opts
 opt_DoEtaReduction             = lookUp  SLIT("-fdo-eta-reduction")
-opt_EnsureSplittableC          = lookUp  SLIT("-fglobalise-toplev-names")
+opt_DoSemiTagging              = lookUp  SLIT("-fsemi-tagging")
 opt_FoldrBuildOn               = lookUp  SLIT("-ffoldr-build-on")
-opt_ForConcurrent              = lookUp  SLIT("-fconcurrent")
+opt_LiberateCaseThreshold      = lookup_def_int "-fliberate-case-threshold" (10::Int)
+opt_NoPreInlining              = lookUp  SLIT("-fno-pre-inlining")
+opt_StgDoLetNoEscapes          = lookUp  SLIT("-flet-no-escape")
+opt_UnfoldCasms                        = lookUp SLIT("-funfold-casms-in-hi-file")
+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")
+opt_EmitCExternDecls           = lookUp  SLIT("-femit-extern-decls")
+opt_EnsureSplittableC          = lookUp  SLIT("-fglobalise-toplev-names")
 opt_GranMacros                 = lookUp  SLIT("-fgransim")
-opt_GlasgowExts                        = lookUp  SLIT("-fglasgow-exts")
---UNUSED:opt_Haskell_1_3       = lookUp  SLIT("-fhaskell-1.3")
-opt_HiMap                      = lookup_str "-himap="  -- file saying where to look for .hi files
+opt_HiMap                      = lookup_str "-himap="       -- file saying where to look for .hi files
+opt_HiVersion                  = lookup_def_int "-fhi-version=" 0 -- what version we're compiling.
+opt_HistorySize                        = lookup_def_int "-fhistory-size" 20
+opt_IgnoreAsserts               = lookUp  SLIT("-fignore-asserts")
 opt_IgnoreIfacePragmas         = lookUp  SLIT("-fignore-interface-pragmas")
-opt_IrrefutableTuples          = lookUp  SLIT("-firrefutable-tuples")
+opt_NoHiCheck                   = lookUp  SLIT("-fno-hi-version-check")
 opt_NoImplicitPrelude          = lookUp  SLIT("-fno-implicit-prelude")
-opt_NumbersStrict              = lookUp  SLIT("-fnumbers-strict")
 opt_OmitBlackHoling            = lookUp  SLIT("-dno-black-holing")
 opt_OmitInterfacePragmas       = lookUp  SLIT("-fomit-interface-pragmas")
-opt_PprStyle_All               = lookUp  SLIT("-dppr-all")
-opt_PprStyle_Debug             = lookUp  SLIT("-dppr-debug")
-opt_PprStyle_User              = lookUp  SLIT("-dppr-user")
-opt_PprUserLength              = lookup_def_int "-dppr-user-length" 5 --ToDo: give this a name
 opt_ProduceC                   = lookup_str "-C="
-opt_ProduceS                   = lookup_str "-S="
+opt_ProduceExportCStubs                = lookup_str "-F="
+opt_ProduceExportHStubs                = lookup_str "-FH="
 opt_ProduceHi                  = lookup_str "-hifile=" -- the one to produce this time 
-opt_ReportWhyUnfoldingsDisallowed= lookUp SLIT("-freport-disallowed-unfoldings")
-opt_SccProfilingOn             = lookUp  SLIT("-fscc-profiling")
-opt_ShowImportSpecs            = lookUp  SLIT("-fshow-import-specs")
-opt_SigsRequired               = lookUp  SLIT("-fsignatures-required")
-opt_SourceUnchanged            = lookUp  SLIT("-fsource-unchanged")
-opt_SpecialiseAll              = lookUp  SLIT("-fspecialise-all")
-opt_SpecialiseImports          = lookUp  SLIT("-fspecialise-imports")
-opt_SpecialiseOverloaded       = lookUp  SLIT("-fspecialise-overloaded")
-opt_SpecialiseTrace            = lookUp  SLIT("-ftrace-specialisation")
-opt_SpecialiseUnboxed          = lookUp  SLIT("-fspecialise-unboxed")
-opt_StgDoLetNoEscapes          = lookUp  SLIT("-flet-no-escape")
-opt_ReturnInRegsThreshold      = lookup_int "-freturn-in-regs-threshold"
-opt_SccGroup                   = lookup_str "-G="
-opt_Verbose                    = lookUp  SLIT("-v")
 
-opt_InterfaceUnfoldThreshold   = lookup_def_int "-funfolding-interface-threshold" iNTERFACE_UNFOLD_THRESHOLD
-opt_UnfoldingCreationThreshold = lookup_def_int "-funfolding-creation-threshold"  uNFOLDING_CREATION_THRESHOLD
-opt_UnfoldingUseThreshold      = lookup_def_int "-funfolding-use-threshold"       uNFOLDING_USE_THRESHOLD
-opt_UnfoldingConDiscount       = lookup_def_int "-funfolding-con-discount"        uNFOLDING_CON_DISCOUNT_WEIGHT
+-- Simplifier switches
+opt_SimplNoPreInlining         = lookUp SLIT("-fno-pre-inlining")
+       -- NoPreInlining is there just to see how bad things
+       -- get if you don't do it!
+opt_SimplDoEtaReduction                = lookUp SLIT("-fdo-eta-reduction")
+opt_SimplDoCaseElim            = lookUp SLIT("-fdo-case-elim")
+opt_SimplDoLambdaEtaExpansion  = lookUp SLIT("-fdo-lambda-eta-expansion")
+opt_SimplCaseOfCase            = lookUp SLIT("-fcase-of-case")
+opt_SimplCaseMerge             = lookUp SLIT("-fcase-merge")
+opt_SimplLetToCase             = lookUp SLIT("-flet-to-case")
+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_UseThreshold            = lookup_def_int "-funfolding-use-threshold"       (8::Int)     -- Discounts can be big
+opt_UF_ScrutConDiscount                = lookup_def_int "-funfolding-con-discount"        (3::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_CheapOp  = ( 0 :: 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_LiberateCaseThreshold      = lookup_def_int "-fliberate-case-threshold"       lIBERATE_CASE_THRESHOLD
-opt_UnfoldingKeenessFactor     = lookup_def_float "-funfolding-keeness-factor"    uNFOLDING_KEENESS_FACTOR
-opt_WarnNameShadowing          = lookUp  SLIT("-fwarn-name-shadowing")
-opt_WarnIncompletePatterns     = lookUp  SLIT("-fwarn-incomplete-patterns")
-opt_WarnOverlappedPatterns     = lookUp  SLIT("-fwarn-overlapped-patterns")
-opt_WarnUnusedNames            = lookUp  SLIT("-fwarn-unused-names")
-opt_WarnMissingMethods         = lookUp  SLIT("-fwarn-missing-methods")
-opt_WarnDuplicateExports       = lookUp  SLIT("-fwarn-duplicate-exports")
-opt_PruneTyDecls               = not (lookUp SLIT("-fno-prune-tydecls"))
-opt_PruneInstDecls             = not (lookUp SLIT("-fno-prune-instdecls"))
-opt_D_show_unused_imports      = lookUp SLIT("-dshow-unused-imports")
-opt_D_show_rn_stats            = lookUp SLIT("-dshow-rn-stats")
-
--- opt_UnfoldingOverrideThreshold      = lookup_int "-funfolding-override-threshold"
-\end{code}
-
-
-\begin{code}
-all_toplev_ids_visible :: Bool
-all_toplev_ids_visible = 
-  not opt_OmitInterfacePragmas ||  -- Pragmas can make them visible
-  opt_EnsureSplittableC        ||  -- Splitting requires visiblilty
-  opt_AutoSccsOnAllToplevs        -- ditto for profiling 
-                                  -- (ToDo: fix up the auto-annotation
-                                  -- pass in the desugarer to avoid having
-                                  -- to do this)
-
+opt_ProduceS                   = lookup_str "-S="
+opt_ReportCompile               = lookUp SLIT("-freport-compile")
+opt_NoPruneDecls               = lookUp SLIT("-fno-prune-decls")
+opt_SourceUnchanged            = lookUp SLIT("-fsource-unchanged")
+opt_Static                     = lookUp SLIT("-static")
+opt_Unregisterised             = lookUp SLIT("-funregisterised")
+opt_Verbose                    = lookUp SLIT("-v")
+
+opt_UseVanillaRegs | opt_Unregisterised = 0
+                  | otherwise          = mAX_Real_Vanilla_REG
+opt_UseFloatRegs   | opt_Unregisterised = 0
+                  | otherwise          = mAX_Real_Float_REG
+opt_UseDoubleRegs  | opt_Unregisterised = 0
+                  | otherwise          = mAX_Real_Double_REG
+opt_UseLongRegs    | opt_Unregisterised = 0
+                  | otherwise          = mAX_Real_Long_REG
 \end{code}
 
-
-
 \begin{code}
 classifyOpts :: ([CoreToDo],   -- Core-to-Core processing spec
                 [StgToDo])     -- STG-to-STG   processing spec
 
 classifyOpts = sep argv [] [] -- accumulators...
   where
-    sep :: [FAST_STRING]                        -- cmd-line opts (input)
+    sep :: [FAST_STRING]                -- cmd-line opts (input)
        -> [CoreToDo] -> [StgToDo]       -- to_do accumulators
        -> ([CoreToDo], [StgToDo])       -- result
 
@@ -391,28 +460,25 @@ classifyOpts = sep argv [] [] -- accumulators...
 
 #      define CORE_TD(to_do) sep opts (to_do:core_td) stg_td
 #      define STG_TD(to_do)  sep opts core_td (to_do:stg_td)
-#      define IGNORE_ARG()   sep opts core_td stg_td
 
     sep (opt1:opts) core_td stg_td
-      =
-       case (_UNPK_ opt1) of -- the non-"just match a string" options are at the end...
-
-         ',' : _       -> IGNORE_ARG() -- it is for the parser
+      = case (_UNPK_ opt1) of -- the non-"just match a string" options are at the end...
+         ',' : _       -> sep opts core_td stg_td -- it is for the parser
 
          "-fsimplify"  -> -- gather up SimplifierSwitches specially...
                           simpl_sep opts defaultSimplSwitches core_td stg_td
 
-         "-fcalc-inlinings1"-> CORE_TD(CoreDoCalcInlinings1)
-         "-fcalc-inlinings2"-> CORE_TD(CoreDoCalcInlinings2)
          "-ffloat-inwards"  -> CORE_TD(CoreDoFloatInwards)
          "-ffull-laziness"  -> CORE_TD(CoreDoFullLaziness)
          "-fliberate-case"  -> CORE_TD(CoreLiberateCase)
+         "-fcse"            -> CORE_TD(CoreCSE)
          "-fprint-core"     -> CORE_TD(CoreDoPrintCore)
          "-fstatic-args"    -> CORE_TD(CoreDoStaticArgs)
          "-fstrictness"     -> CORE_TD(CoreDoStrictness)
+         "-fworker-wrapper" -> CORE_TD(CoreDoWorkerWrapper)
          "-fspecialise"     -> CORE_TD(CoreDoSpecialising)
-         "-ffoldr-build-worker-wrapper"  -> CORE_TD(CoreDoFoldrBuildWorkerWrapper)
-         "-ffoldr-build-ww-anal"  -> CORE_TD(CoreDoFoldrBuildWWAnal)
+         "-fusagesp"        -> CORE_TD(CoreDoUSPInf)
+         "-fcpr-analyse"    -> CORE_TD(CoreDoCPResult)
 
          "-fstg-static-args" -> STG_TD(StgDoStaticArgs)
          "-fupdate-analysis" -> STG_TD(StgDoUpdateAnalysis)
@@ -421,14 +487,14 @@ classifyOpts = sep argv [] [] -- accumulators...
          "-fmassage-stg-for-profiling" -> STG_TD(StgDoMassageForProfiling)
 
          _ -> -- NB: the driver is really supposed to handle bad options
-              IGNORE_ARG()
+              sep opts core_td stg_td
 
     ----------------
 
-    simpl_sep :: [FAST_STRING]     -- cmd-line opts (input)
-       -> [SimplifierSwitch]       -- simplifier-switch accumulator
-       -> [CoreToDo] -> [StgToDo]  -- to_do accumulators
-       -> ([CoreToDo], [StgToDo])  -- result
+    simpl_sep :: [FAST_STRING]            -- cmd-line opts (input)
+             -> [SimplifierSwitch]       -- simplifier-switch accumulator
+             -> [CoreToDo] -> [StgToDo]  -- to_do accumulators
+             -> ([CoreToDo], [StgToDo])  -- result
 
        -- "simpl_sep" tailcalls "sep" once it's seen one set
        -- of SimplifierSwitches for a CoreDoSimplify.
@@ -448,42 +514,23 @@ classifyOpts = sep argv [] [] -- accumulators...
                 in
                 sep opts (this_simpl : core_td) stg_td
 
-#        define SIMPL_SW(sw) simpl_sep opts (sw:simpl_sw) core_td stg_td
-
-         -- the non-"just match a string" options are at the end...
-         "-fshow-simplifier-progress"      -> SIMPL_SW(ShowSimplifierProgress)
-         "-fcode-duplication-ok"           -> SIMPL_SW(SimplOkToDupCode)
-         "-ffloat-lets-exposing-whnf"      -> SIMPL_SW(SimplFloatLetsExposingWHNF)
-         "-ffloat-primops-ok"              -> SIMPL_SW(SimplOkToFloatPrimOps)
-         "-falways-float-lets-from-lets"   -> SIMPL_SW(SimplAlwaysFloatLetsFromLets)
-         "-fdo-case-elim"                  -> SIMPL_SW(SimplDoCaseElim)
-         "-fdo-lambda-eta-expansion"       -> SIMPL_SW(SimplDoLambdaEtaExpansion)
-         "-fdo-foldr-build"                -> SIMPL_SW(SimplDoFoldrBuild)
-         "-fdo-not-fold-back-append"       -> SIMPL_SW(SimplDontFoldBackAppend)
-         "-fdo-arity-expand"               -> SIMPL_SW(SimplDoArityExpand)
-         "-fdo-inline-foldr-build"         -> SIMPL_SW(SimplDoInlineFoldrBuild)
-         "-freuse-con"                     -> SIMPL_SW(SimplReuseCon)
-         "-fcase-of-case"                  -> SIMPL_SW(SimplCaseOfCase)
-         "-fcase-merge"                    -> SIMPL_SW(SimplCaseMerge)
-         "-flet-to-case"                   -> SIMPL_SW(SimplLetToCase)
-         "-fpedantic-bottoms"              -> SIMPL_SW(SimplPedanticBottoms)
-         "-fkeep-spec-pragma-ids"          -> SIMPL_SW(KeepSpecPragmaIds)
-         "-fkeep-unused-bindings"          -> SIMPL_SW(KeepUnusedBindings)
-         "-fmay-delete-conjurable-ids"     -> SIMPL_SW(SimplMayDeleteConjurableIds)
-         "-fessential-unfoldings-only"     -> SIMPL_SW(EssentialUnfoldingsOnly)
-         "-fignore-inline-pragma"          -> SIMPL_SW(IgnoreINLINEPragma)
-         "-fno-let-from-case"              -> SIMPL_SW(SimplNoLetFromCase)
-         "-fno-let-from-app"               -> SIMPL_SW(SimplNoLetFromApp)
-         "-fno-let-from-strict-let"        -> SIMPL_SW(SimplNoLetFromStrictLet)
-
-         o | starts_with_msi  -> SIMPL_SW(MaxSimplifierIterations (read after_msi))
-          where
-           maybe_msi           = startsWith "-fmax-simplifier-iterations"   o
-           starts_with_msi     = maybeToBool maybe_msi
-           (Just after_msi)    = maybe_msi
+         opt -> case matchSimplSw opt of
+                       Just sw -> simpl_sep opts (sw:simpl_sw) core_td stg_td
+                       Nothing -> simpl_sep opts simpl_sw      core_td stg_td
 
-         _ -> -- NB: the driver is really supposed to handle bad options
-              simpl_sep opts simpl_sw core_td stg_td
+matchSimplSw opt
+  = firstJust  [ matchSwInt  opt "-fmax-simplifier-iterations"         MaxSimplifierIterations
+               , matchSwInt  opt "-finline-phase"                      SimplInlinePhase
+               ]
+
+matchSwBool :: String -> String -> a -> Maybe a
+matchSwBool opt str sw | opt == str = Just sw
+                      | otherwise  = Nothing
+
+matchSwInt :: String -> String -> (Int -> a) -> Maybe a
+matchSwInt opt str sw = case startsWith str opt of
+                           Just opt_left -> Just (sw (read opt_left))
+                           Nothing       -> Nothing
 \end{code}
 
 %************************************************************************
@@ -503,38 +550,13 @@ instance Ord SimplifierSwitch where
     a <  b  = tagOf_SimplSwitch a _LT_ tagOf_SimplSwitch b
     a <= b  = tagOf_SimplSwitch a _LE_ tagOf_SimplSwitch b
 
-tagOf_SimplSwitch SimplOkToDupCode             =(ILIT(0) :: FAST_INT)
-tagOf_SimplSwitch SimplFloatLetsExposingWHNF   = ILIT(1)
-tagOf_SimplSwitch SimplOkToFloatPrimOps                = ILIT(2)
-tagOf_SimplSwitch SimplAlwaysFloatLetsFromLets = ILIT(3)
-tagOf_SimplSwitch SimplDoCaseElim              = ILIT(4)
-tagOf_SimplSwitch SimplReuseCon                        = ILIT(5)
-tagOf_SimplSwitch SimplCaseOfCase              = ILIT(6)
-tagOf_SimplSwitch SimplLetToCase               = ILIT(7)
-tagOf_SimplSwitch SimplMayDeleteConjurableIds  = ILIT(9)
-tagOf_SimplSwitch SimplPedanticBottoms         = ILIT(10)
-tagOf_SimplSwitch SimplDoArityExpand           = ILIT(11)
-tagOf_SimplSwitch SimplDoFoldrBuild            = ILIT(12)
-tagOf_SimplSwitch SimplDoInlineFoldrBuild      = ILIT(14)
-tagOf_SimplSwitch IgnoreINLINEPragma           = ILIT(15)
-tagOf_SimplSwitch SimplDoLambdaEtaExpansion    = ILIT(16)
-tagOf_SimplSwitch EssentialUnfoldingsOnly      = ILIT(19)
-tagOf_SimplSwitch ShowSimplifierProgress       = ILIT(20)
-tagOf_SimplSwitch (MaxSimplifierIterations _)  = ILIT(21)
-tagOf_SimplSwitch KeepSpecPragmaIds            = ILIT(25)
-tagOf_SimplSwitch KeepUnusedBindings           = ILIT(26)
-tagOf_SimplSwitch SimplNoLetFromCase           = ILIT(27)
-tagOf_SimplSwitch SimplNoLetFromApp            = ILIT(28)
-tagOf_SimplSwitch SimplNoLetFromStrictLet      = ILIT(29)
-tagOf_SimplSwitch SimplDontFoldBackAppend       = ILIT(30)
-tagOf_SimplSwitch SimplCaseMerge               = ILIT(31)
-tagOf_SimplSwitch SimplCaseScrutinee           = ILIT(32)
 
--- If you add anything here, be sure to change lAST_SIMPL_SWITCH_TAG, too!
+tagOf_SimplSwitch (SimplInlinePhase _)         = ILIT(1)
+tagOf_SimplSwitch (MaxSimplifierIterations _)  = ILIT(2)
 
-tagOf_SimplSwitch _ = panic# "tagOf_SimplSwitch"
+-- If you add anything here, be sure to change lAST_SIMPL_SWITCH_TAG, too!
 
-lAST_SIMPL_SWITCH_TAG = IBOX(tagOf_SimplSwitch SimplCaseScrutinee)
+lAST_SIMPL_SWITCH_TAG = 2
 \end{code}
 
 %************************************************************************
@@ -544,22 +566,6 @@ lAST_SIMPL_SWITCH_TAG = IBOX(tagOf_SimplSwitch SimplCaseScrutinee)
 %************************************************************************
 
 \begin{code}
-#if __GLASGOW_HASKELL__ == 201
-# define ARRAY     Array
-# define LIFT      GHCbase.Lift
-# define SET_TO            =:
-(=:) a b = (a,b)
-#elif __GLASGOW_HASKELL__ >= 202
-# define ARRAY     Array
-# define LIFT      Lift
-# define SET_TO            =:
-(=:) a b = (a,b)
-#else
-# define ARRAY     _Array
-# define LIFT      _Lift
-# define SET_TO            :=
-#endif
-
 isAmongSimpl :: [SimplifierSwitch] -> SimplifierSwitch -> SwitchResult
 
 isAmongSimpl on_switches               -- Switches mentioned later occur *earlier*
@@ -570,25 +576,30 @@ isAmongSimpl on_switches          -- Switches mentioned later occur *earlier*
                -- ie the ones that occur earliest in the list.
 
        sw_tbl :: Array Int SwitchResult
-
        sw_tbl = (array (0, lAST_SIMPL_SWITCH_TAG) -- bounds...
                        all_undefined)
                 // defined_elems
 
-       all_undefined = [ i SET_TO SwBool False | i <- [0 .. lAST_SIMPL_SWITCH_TAG ] ]
+       all_undefined = [ (i, SwBool False) | i <- [0 .. lAST_SIMPL_SWITCH_TAG ] ]
 
        defined_elems = map mk_assoc_elem tidied_on_switches
     in
     -- (avoid some unboxing, bounds checking, and other horrible things:)
-    case sw_tbl of { ARRAY bounds_who_needs_'em stuff ->
+    case sw_tbl of { Array bounds_who_needs_'em stuff ->
     \ switch ->
        case (indexArray# stuff (tagOf_SimplSwitch switch)) of
-         LIFT v -> v
+#if __GLASGOW_HASKELL__ < 400
+         Lift v -> v
+#elif __GLASGOW_HASKELL__ < 403
+         (# _, v #) -> v
+#else
+         (# v #) -> v
+#endif
     }
   where
-    mk_assoc_elem k@(MaxSimplifierIterations lvl)       = IBOX(tagOf_SimplSwitch k) SET_TO SwInt lvl
-
-    mk_assoc_elem k = IBOX(tagOf_SimplSwitch k) SET_TO SwBool   True -- I'm here, Mom!
+    mk_assoc_elem k@(MaxSimplifierIterations lvl) = (IBOX(tagOf_SimplSwitch k), SwInt lvl)
+    mk_assoc_elem k@(SimplInlinePhase n)          = (IBOX(tagOf_SimplSwitch k), SwInt n)
+    mk_assoc_elem k                              = (IBOX(tagOf_SimplSwitch k), SwBool True) -- I'm here, Mom!
 
     -- cannot have duplicates if we are going to use the array thing
     rm_dups switches_so_far switch
@@ -604,8 +615,7 @@ isAmongSimpl on_switches            -- Switches mentioned later occur *earlier*
 Default settings for simplifier switches
 
 \begin{code}
-defaultSimplSwitches = [MaxSimplifierIterations                1
-                      ]
+defaultSimplSwitches = [MaxSimplifierIterations        1]
 \end{code}
 
 %************************************************************************
@@ -623,15 +633,6 @@ switchIsOn lookup_fn switch
       SwBool False -> False
       _                   -> True
 
-stringSwitchSet :: (switch -> SwitchResult)
-               -> (FAST_STRING -> switch)
-               -> Maybe FAST_STRING
-
-stringSwitchSet lookup_fn switch
-  = case (lookup_fn (switch (panic "stringSwitchSet"))) of
-      SwString str -> Just str
-      _                   -> Nothing
-
 intSwitchSet :: (switch -> SwitchResult)
             -> (Int -> switch)
             -> Maybe Int
@@ -641,3 +642,19 @@ intSwitchSet lookup_fn switch
       SwInt int -> Just int
       _                -> Nothing
 \end{code}
+
+\begin{code}
+startsWith :: String -> String -> Maybe String
+-- startsWith pfx (pfx++rest) = Just rest
+
+startsWith []     str = Just str
+startsWith (c:cs) (s:ss)
+  = if c /= s then Nothing else startsWith cs ss
+startsWith  _    []  = Nothing
+
+endsWith  :: String -> String -> Maybe String
+endsWith cs ss
+  = case (startsWith (reverse cs) (reverse ss)) of
+      Nothing -> Nothing
+      Just rs -> Just (reverse rs)
+\end{code}