[project @ 1999-07-14 11:16:43 by simonmar]
[ghc-hetmet.git] / ghc / driver / ghc.lprl
index fedb756..9886de5 100644 (file)
@@ -281,11 +281,11 @@ these are turned off by -Wnot.
                     '-fwarn-missing-methods',
                     '-fwarn-duplicate-exports');
 @MinusWOpts              = (@StandardWarnings, 
-                    '-fwarn-incomplete-patterns', 
                     '-fwarn-unused-binds',
+                    '-fwarn-unused-matches',
+                    '-fwarn-incomplete-patterns', 
                     '-fwarn-unused-imports');
 @MinusWallOpts           = (@MinusWOpts, 
-                    '-fwarn-unused-matches',
                     '-fwarn-type-defaults',
                     '-fwarn-name-shadowing',
                     '-fwarn-missing-signatures');
@@ -702,7 +702,6 @@ sub setupOptimiseFlags {
        '-ffoldr-build-on',
 
         '-fdo-eta-reduction',
-       '-fdo-case-elim',
        '-fdo-lambda-eta-expansion',
        '-fcase-of-case',
        '-fcase-merge',
@@ -713,65 +712,58 @@ sub setupOptimiseFlags {
 
        '-fsimplify',
          '[', 
-         '-finline-phase1',            # Don't inline rule Ids till specialisation has bitten
-
-#              APR 99: the stuff in this comment is now
-#              handled by -finline-phase1
-#
-# I don't understand why we want -fessential-unfoldings-only here
-# If we have it, the following nasty thing happens:
-#      f  = E
-#      g* = f
-#      ...g...
-# where "*" means exported.
-# In the essential-unfoldings pass we still substitute f for g
-# but we don't substitute E for f first.  So we get
-#      f  = E
-#      g* = f
-#      ...f...
-# The g=f will get reverse-substituted later, but it's untidy. --SLPJ
-#
-# SDM: Here's why it's necessary.
-#
-#   If we unfold in the first pass before the specialiser is run
-#   we miss opportunities for specialisation because eg. wrappers
-#   have been inlined for specialisable functions.  
-#
-#   This shows up in PrelArr.lhs - the specialised instance for newArray 
-#   calls the generic rangeSize, because rangeSize is strict and is
-#   replaced by its wrapper by the simplifier.
-#        '-fessential-unfoldings-only',
-#        '-fsimpl-uf-use-threshold0',
-
-         '-fmax-simplifier-iterations2',
+               '-finline-phase0',      # Don't inline anything till full laziness has bitten
+                                       # In particular, inlining wrappers inhibits floating
+                                       # e.g. ...(case f x of ...)...
+                                       #  ==> ...(case (case x of I# x# -> fw x#) of ...)...
+                                       #  ==> ...(case x of I# x# -> case fw x# of ...)...
+                                       # and now the redex (f x) isn't floatable any more
+               '-fmax-simplifier-iterations2',
          ']',
 
+       # Specialisation is best done before full laziness
+       # so that overloaded functions have all their dictionary lambdas manifest
        ($Oopt_DoSpecialise) ? ( $Oopt_DoSpecialise, ) : (),
+       '-ffull-laziness',
+       '-ffloat-inwards',
+
+#      '-fsimplify',
+#        '[', 
+#              # Run the simplifier before specialising, so that overloaded functions
+#              # look like             f = \d -> ...
+#              # (Full laziness may lift out something hiding the \d
+#              '-finline-phase1',
+#              '-fmax-simplifier-iterations1',
+#        ']',
 
-        $Oopt_UsageSPInf, # infer usage information here in case we need it later.
-                          # (add more of these where you need them --KSW 1999-04)
 
        '-fsimplify',
          '[', 
-               $Oopt_MaxSimplifierIterations,  
-
-               # Still don't inline transformation rule Ids, to give the
-               # rules a good chance to fire
-               '-finline-phase1',
+               '-finline-phase1',
+               # Want to run with inline phase 1 after the specialiser to give
+               # maximum chance for fusion to work before we inline build/augment
+               # in phase 2.  This made a difference in 'ansi' where an overloaded
+               # function wasn't inlined till too late.
+               $Oopt_MaxSimplifierIterations,  
          ']',
 
-       '-ffull-laziness',
-
-       '-ffloat-inwards',
+        $Oopt_UsageSPInf, # infer usage information here in case we need it later.
+                          # (add more of these where you need them --KSW 1999-04)
 
        '-fsimplify',
          '[', 
-               '-finline-phase2',
-               $Oopt_MaxSimplifierIterations,  
+               # Need inline-phase2 here so that build/augment get 
+               # inlined.  I found that spectral/hartel/genfft lost some useful
+               # strictness in the function sumcode' if augment is not inlined
+               # before strictness analysis runs
+
+               '-finline-phase2',
+               $Oopt_MaxSimplifierIterations,  
          ']',
 
+
        '-fstrictness',
-       # '-fcpr-analyse',
+       '-fcpr-analyse',
        '-fworker-wrapper',
 
        '-fsimplify',
@@ -780,6 +772,14 @@ sub setupOptimiseFlags {
                # No -finline-phase: allow all Ids to be inlined now
          ']',
 
+       '-fcse',        # CSE must immediately follow a simplification pass, because it relies
+                       # on the no-shadowing invariant.  See comments at the top of CSE.lhs
+                
+       '-ffull-laziness',      # nofib/spectral/hartel/wang doubles in speed if you
+                               # do full laziness late in the day.  It only happens
+                               # after fusion and other stuff, so the early pass doesn't
+                               # catch it.  For the record, the redex is 
+                               #       f_el22 (f_el21 r_midblock)
        '-ffloat-inwards',
 
 # Case-liberation for -O2.  This should be after
@@ -794,6 +794,7 @@ sub setupOptimiseFlags {
        '-fsimplify',
          '[', 
                $Oopt_MaxSimplifierIterations,  
+               # No -finline-phase: allow all Ids to be inlined now
          ']',
 
       #        '-fstatic-args',
@@ -1079,6 +1080,7 @@ sub setupLinkOpts {
           ,'-u', "${uscore}PrelPack_unpackCString_closure"
           ,'-u', "${uscore}PrelException_stackOverflow_closure"
           ,'-u', "${uscore}PrelException_heapOverflow_closure"
+          ,'-u', "${uscore}PrelException_NonTermination_static_closure"
        ));
   if (!$NoHaskellMain) {
    unshift (@Ld_flags,'-u', "${uscore}PrelMain_mainIO_closure");
@@ -3058,6 +3060,7 @@ arg: while($_ = $Args[0]) {
     /^-fallow-overlapping-instances$/ && do { push(@HsC_flags, $_); next arg; };
     /^-fallow-undecidable-instances$/ && do { push(@HsC_flags, $_); next arg; };
     /^-fhistory-size.*$/             && do { push(@HsC_flags, $_); next arg; };
+    /^-fdicts-strict$/                       && do { push(@HsC_flags, $_); next arg; };
     /^-fglasgow-exts$/
                && do { push(@HsC_flags, $_);