Add static flag -fsimple-list-literals
authorsimonpj@microsoft.com <unknown>
Fri, 5 Dec 2008 10:50:02 +0000 (10:50 +0000)
committersimonpj@microsoft.com <unknown>
Fri, 5 Dec 2008 10:50:02 +0000 (10:50 +0000)
The new static flag -fsimple-list-literals makes ExplicitList literals
be desugared in the straightforward way, rather than using 'build' as
now.  See SLPJ comments with Note [Desugaring explicit lists].

I don't expect this flag to be used by users (hence no docs). It's just
there to let me try the performance effects of switching on and off.

compiler/deSugar/DsExpr.lhs
compiler/main/StaticFlagParser.hs
compiler/main/StaticFlags.hs

index b91380d..6126b63 100644 (file)
@@ -47,6 +47,7 @@ import CoreUtils
 import MkCore
 
 import DynFlags
 import MkCore
 
 import DynFlags
+import StaticFlags
 import CostCentre
 import Id
 import PrelInfo
 import CostCentre
 import Id
 import PrelInfo
@@ -609,6 +610,23 @@ allocation in some nofib programs. Specifically
 
 Of course, if rules aren't turned on then there is pretty much no
 point doing this fancy stuff, and it may even be harmful.
 
 Of course, if rules aren't turned on then there is pretty much no
 point doing this fancy stuff, and it may even be harmful.
+
+=======>  Note by SLPJ Dec 08.
+
+I'm unconvinced that we should *ever* generate a build for an explicit
+list.  See the comments in GHC.Base about the foldr/cons rule, which 
+points out that (foldr k z [a,b,c]) may generate *much* less code than
+(a `k` b `k` c `k` z).
+
+Furthermore generating builds messes up the LHS of RULES. 
+Example: the foldr/single rule in GHC.Base
+   foldr k z [x] = ...
+We do not want to generate a build invocation on the LHS of this RULE!
+
+To test this I've added a (static) flag -fsimple-list-literals, which
+makes all list literals be generated via the simple route.  
+
+
 \begin{code}
 
 dsExplicitList :: PostTcType -> [LHsExpr Id] -> DsM CoreExpr
 \begin{code}
 
 dsExplicitList :: PostTcType -> [LHsExpr Id] -> DsM CoreExpr
@@ -616,7 +634,7 @@ dsExplicitList :: PostTcType -> [LHsExpr Id] -> DsM CoreExpr
 dsExplicitList elt_ty xs = do
     dflags <- getDOptsDs
     xs' <- mapM dsLExpr xs
 dsExplicitList elt_ty xs = do
     dflags <- getDOptsDs
     xs' <- mapM dsLExpr xs
-    if not (dopt Opt_EnableRewriteRules dflags)
+    if  opt_SimpleListLiterals || not (dopt Opt_EnableRewriteRules dflags)
         then return $ mkListExpr elt_ty xs'
         else mkBuildExpr elt_ty (mkSplitExplicitList (thisPackage dflags) xs')
   where
         then return $ mkListExpr elt_ty xs'
         else mkBuildExpr elt_ty (mkSplitExplicitList (thisPackage dflags) xs')
   where
index e68a111..0ed9356 100644 (file)
@@ -159,8 +159,7 @@ static_flags = [
          Supported
 
         -- Pass all remaining "-f<blah>" options to hsc
          Supported
 
         -- Pass all remaining "-f<blah>" options to hsc
-  , Flag "f"                      (AnySuffixPred (isStaticFlag) addOpt)
-         Supported
+  , Flag "f" (AnySuffixPred isStaticFlag addOpt) Supported
   ]
 
 isStaticFlag :: String -> Bool
   ]
 
 isStaticFlag :: String -> Bool
@@ -178,6 +177,7 @@ isStaticFlag f =
     "fno-hi-version-check",
     "dno-black-holing",
     "fno-state-hack",
     "fno-hi-version-check",
     "dno-black-holing",
     "fno-state-hack",
+    "fsimple-list-literals",
     "fno-ds-multi-tyvar",
     "fruntime-types",
     "fno-pre-inlining",
     "fno-ds-multi-tyvar",
     "fruntime-types",
     "fno-pre-inlining",
index 2398c20..99f3f84 100644 (file)
@@ -43,6 +43,7 @@ module StaticFlags (
        -- optimisation opts
        opt_DsMultiTyVar,
        opt_NoStateHack,
        -- optimisation opts
        opt_DsMultiTyVar,
        opt_NoStateHack,
+        opt_SimpleListLiterals,
        opt_SpecInlineJoinPoints,
        opt_CprOff,
        opt_SimplNoPreInlining,
        opt_SpecInlineJoinPoints,
        opt_CprOff,
        opt_SimplNoPreInlining,
@@ -227,8 +228,12 @@ opt_DsMultiTyVar           = not (lookUp (fsLit "-fno-ds-multi-tyvar"))
 opt_SpecInlineJoinPoints :: Bool
 opt_SpecInlineJoinPoints       = lookUp  (fsLit "-fspec-inline-join-points")
 
 opt_SpecInlineJoinPoints :: Bool
 opt_SpecInlineJoinPoints       = lookUp  (fsLit "-fspec-inline-join-points")
 
+opt_SimpleListLiterals :: Bool
+opt_SimpleListLiterals         = lookUp  (fsLit "-fsimple-list-literals")
+
 opt_NoStateHack :: Bool
 opt_NoStateHack                        = lookUp  (fsLit "-fno-state-hack")
 opt_NoStateHack :: Bool
 opt_NoStateHack                        = lookUp  (fsLit "-fno-state-hack")
+
 opt_CprOff :: Bool
 opt_CprOff                     = lookUp  (fsLit "-fcpr-off")
        -- Switch off CPR analysis in the new demand analyser
 opt_CprOff :: Bool
 opt_CprOff                     = lookUp  (fsLit "-fcpr-off")
        -- Switch off CPR analysis in the new demand analyser