[project @ 2004-02-25 14:51:37 by simonpj]
authorsimonpj <unknown>
Wed, 25 Feb 2004 14:51:38 +0000 (14:51 +0000)
committersimonpj <unknown>
Wed, 25 Feb 2004 14:51:38 +0000 (14:51 +0000)
Add a -fno-full-laziness flag

ghc/compiler/main/CmdLineOpts.lhs
ghc/compiler/main/DriverFlags.hs
ghc/docs/users_guide/flags.sgml

index cedf8cc..c55f322 100644 (file)
@@ -282,6 +282,7 @@ data DynFlag
 
    -- optimisation opts
    | Opt_Strictness
+   | Opt_FullLaziness
    | Opt_CSE
    | Opt_IgnoreInterfacePragmas
    | Opt_OmitInterfacePragmas
@@ -373,8 +374,9 @@ defaultDynFlags = DynFlags {
            Opt_Strictness,
                        -- strictness is on by default, but this only
                        -- applies to -O.
-           Opt_CSE,
-                       -- similarly for CSE.
+           Opt_CSE,            -- similarly for CSE.
+           Opt_FullLaziness,   -- ...and for full laziness
+
            Opt_DoLambdaEtaExpansion,
                        -- This one is important for a tiresome reason:
                        -- we want to make sure that the bindings for data 
@@ -478,11 +480,12 @@ opt_1_dopts = [
 buildCoreToDo :: DynFlags -> [CoreToDo]
 buildCoreToDo dflags = core_todo
   where
-    opt_level  = optLevel dflags
-    max_iter   = maxSimplIterations dflags
-    strictness = dopt Opt_Strictness dflags
-    cse        = dopt Opt_CSE dflags
-    rule_check = ruleCheck dflags
+    opt_level            = optLevel dflags
+    max_iter             = maxSimplIterations dflags
+    strictness    = dopt Opt_Strictness dflags
+    full_laziness = dopt Opt_FullLaziness dflags
+    cse           = dopt Opt_CSE dflags
+    rule_check    = ruleCheck dflags
 
     core_todo = 
      if opt_level == 0 then
@@ -516,7 +519,9 @@ buildCoreToDo dflags = core_todo
        -- so that overloaded functions have all their dictionary lambdas manifest
        CoreDoSpecialising,
 
-       CoreDoFloatOutwards (FloatOutSw False False),
+       if full_laziness then CoreDoFloatOutwards (FloatOutSw False False)
+                        else CoreDoNothing,
+
        CoreDoFloatInwards,
 
        CoreDoSimplify (SimplPhase 2) [
@@ -564,8 +569,10 @@ buildCoreToDo dflags = core_todo
           MaxSimplifierIterations max_iter
        ],
 
-       CoreDoFloatOutwards (FloatOutSw False   -- Not lambdas
-                                       True),  -- Float constants
+       if full_laziness then
+         CoreDoFloatOutwards (FloatOutSw False   -- Not lambdas
+                                         True)   -- Float constants
+       else CoreDoNothing,
                -- 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
index 7d317ac..63c36ac 100644 (file)
@@ -464,6 +464,7 @@ fFlags = [
   ( "allow-incoherent-instances",      Opt_AllowIncoherentInstances ),
   ( "generics",                        Opt_Generics ),
   ( "strictness",                      Opt_Strictness ),
+  ( "full-laziness",                   Opt_FullLaziness ),
   ( "cse",                             Opt_CSE ),
   ( "ignore-interface-pragmas",                Opt_IgnoreInterfacePragmas ),
   ( "omit-interface-pragmas",          Opt_OmitInterfacePragmas ),
index 01c074f..db507f3 100644 (file)
            </row>
 
            <row>
+             <entry><option>-fno-full-laziness</option></entry>
+             <entry>Turn off full laziness (floating bindings outwards)</entry>
+             <entry>dynamic</entry>
+             <entry>-</entry>
+           </row>
+
+           <row>
              <entry><option>-fno-pre-inlining</option></entry>
              <entry>Turn off pre-inlining</entry>
              <entry>static</entry>