intSwitchSet,
switchIsOn,
+ 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_WarnDuplicateExports,
opt_WarnHiShadows,
opt_WarnIncompletePatterns,
+ opt_WarnMissingFields,
opt_WarnMissingMethods,
opt_WarnMissingSigs,
opt_WarnNameShadowing,
opt_IrrefutableTuples,
opt_NumbersStrict,
opt_Parallel,
+ opt_SMP,
-- 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_EnsureSplittableC,
opt_GranMacros,
opt_HiMap,
+ opt_HiMapSep,
opt_HiVersion,
opt_HistorySize,
opt_IgnoreAsserts,
import Argv
import Constants -- Default values for some flags
+import FastString ( headFS )
import Maybes ( assocMaybe, firstJust, maybeToBool )
import Panic ( panic, panic# )
| CoreDoSpecialising
| CoreDoUSPInf
| CoreDoCPResult
+ | CoreCSE
\end{code}
\begin{code}
data SimplifierSwitch
= MaxSimplifierIterations Int
| SimplInlinePhase Int
+ | DontApplyRules
+ | SimplLetToCase
\end{code}
%************************************************************************
Nothing -> def -- Use default
Just xx -> read xx
+lookup_def_char sw def = case (lookup_str sw) of
+ Just (xx:_) -> xx
+ _ -> def -- Use default
+
lookup_def_float sw def = case (lookup_str sw) of
Nothing -> def -- Use default
Just xx -> read xx
\end{code}
\begin{code}
+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_realC = lookUp SLIT("-ddump-realC")
-opt_D_dump_rn = lookUp SLIT("-ddump-rn")
-opt_D_dump_simpl = lookUp SLIT("-ddump-simpl")
-opt_D_dump_simpl_iterations = lookUp SLIT("-ddump-simpl-iterations")
-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_worker_wrapper = lookUp SLIT("-ddump-workwrap")
-opt_D_show_passes = lookUp SLIT("-dshow-passes")
-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_D_dump_all {- do not -} = lookUp SLIT("-ddump-all")
+opt_D_dump_most {- export -} = opt_D_dump_all || lookUp SLIT("-ddump-most")
+
+opt_D_dump_absC = opt_D_dump_all || lookUp SLIT("-ddump-absC")
+opt_D_dump_asm = opt_D_dump_all || lookUp SLIT("-ddump-asm")
+opt_D_dump_cpranal = opt_D_dump_most || lookUp SLIT("-ddump-cpranal")
+opt_D_dump_deriv = opt_D_dump_most || lookUp SLIT("-ddump-deriv")
+opt_D_dump_ds = opt_D_dump_most || lookUp SLIT("-ddump-ds")
+opt_D_dump_flatC = opt_D_dump_all || lookUp SLIT("-ddump-flatC")
+opt_D_dump_foreign = opt_D_dump_most || lookUp SLIT("-ddump-foreign-stubs")
+opt_D_dump_inlinings = opt_D_dump_all || lookUp SLIT("-ddump-inlinings")
+opt_D_dump_occur_anal = opt_D_dump_all || lookUp SLIT("-ddump-occur-anal")
+opt_D_dump_parsed = opt_D_dump_most || lookUp SLIT("-ddump-parsed")
+opt_D_dump_realC = opt_D_dump_all || lookUp SLIT("-ddump-realC")
+opt_D_dump_rn = opt_D_dump_most || lookUp SLIT("-ddump-rn")
+opt_D_dump_simpl = opt_D_dump_most || lookUp SLIT("-ddump-simpl")
+opt_D_dump_simpl_iterations = opt_D_dump_all || lookUp SLIT("-ddump-simpl-iterations")
+opt_D_dump_spec = opt_D_dump_most || lookUp SLIT("-ddump-spec")
+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_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_dump_worker_wrapper = opt_D_dump_most || lookUp SLIT("-ddump-workwrap")
+opt_D_show_passes = opt_D_dump_most || lookUp SLIT("-dshow-passes")
+opt_D_dump_rn_trace = opt_D_dump_all || lookUp SLIT("-ddump-rn-trace")
+opt_D_dump_rn_stats = opt_D_dump_most || lookUp SLIT("-ddump-rn-stats")
+opt_D_dump_simpl_stats = opt_D_dump_most || lookUp SLIT("-ddump-simpl-stats")
+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_DoCoreLinting = lookUp SLIT("-dcore-lint")
opt_DoStgLinting = lookUp SLIT("-dstg-lint")
opt_DoUSPLinting = lookUp SLIT("-dusagesp-lint")
opt_WarnDuplicateExports = lookUp SLIT("-fwarn-duplicate-exports")
opt_WarnHiShadows = lookUp SLIT("-fwarn-hi-shadowing")
opt_WarnIncompletePatterns = lookUp SLIT("-fwarn-incomplete-patterns")
+opt_WarnMissingFields = lookUp SLIT("-fwarn-missing-fields")
opt_WarnMissingMethods = lookUp SLIT("-fwarn-missing-methods")
opt_WarnMissingSigs = lookUp SLIT("-fwarn-missing-signatures")
opt_WarnNameShadowing = lookUp SLIT("-fwarn-name-shadowing")
opt_MaxContextReductionDepth = lookup_def_int "-fcontext-stack" mAX_CONTEXT_REDUCTION_DEPTH
opt_NumbersStrict = lookUp SLIT("-fnumbers-strict")
opt_Parallel = lookUp SLIT("-fparallel")
+opt_SMP = lookUp SLIT("-fsmp")
-- optimisation opts
opt_DoEtaReduction = lookUp SLIT("-fdo-eta-reduction")
opt_DoSemiTagging = lookUp SLIT("-fsemi-tagging")
opt_FoldrBuildOn = lookUp SLIT("-ffoldr-build-on")
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_EnsureSplittableC = lookUp SLIT("-fglobalise-toplev-names")
opt_GranMacros = lookUp SLIT("-fgransim")
opt_HiMap = lookup_str "-himap=" -- file saying where to look for .hi files
+opt_HiMapSep = lookup_def_char "-himap-sep=" ':'
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")
-- 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_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_CheapOp = ( 1 :: Int)
-opt_UF_DearOp = ( 8 :: Int)
+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_ProduceS = lookup_str "-S="
"-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)
matchSimplSw opt
= firstJust [ matchSwInt opt "-fmax-simplifier-iterations" MaxSimplifierIterations
, matchSwInt opt "-finline-phase" SimplInlinePhase
+ , matchSwBool opt "-fno-rules" DontApplyRules
+ , matchSwBool opt "-flet-to-case" SimplLetToCase
]
matchSwBool :: String -> String -> a -> Maybe a
tagOf_SimplSwitch (SimplInlinePhase _) = ILIT(1)
tagOf_SimplSwitch (MaxSimplifierIterations _) = ILIT(2)
+tagOf_SimplSwitch DontApplyRules = ILIT(3)
+tagOf_SimplSwitch SimplLetToCase = ILIT(4)
-- If you add anything here, be sure to change lAST_SIMPL_SWITCH_TAG, too!
-lAST_SIMPL_SWITCH_TAG = 2
+lAST_SIMPL_SWITCH_TAG = 4
\end{code}
%************************************************************************
defined_elems = map mk_assoc_elem tidied_on_switches
in
-- (avoid some unboxing, bounds checking, and other horrible things:)
+#if __GLASGOW_HASKELL__ < 405
case sw_tbl of { Array bounds_who_needs_'em stuff ->
+#else
+ case sw_tbl of { Array _ _ stuff ->
+#endif
\ switch ->
case (indexArray# stuff (tagOf_SimplSwitch switch)) of
#if __GLASGOW_HASKELL__ < 400