[project @ 1996-04-05 08:26:04 by partain]
[ghc-hetmet.git] / ghc / compiler / simplCore / SimplVar.lhs
index 9cbbe56..84555a7 100644 (file)
@@ -11,30 +11,31 @@ module SimplVar (
        leastItCouldCost
     ) where
 
-IMPORT_Trace
+import Ubiq{-uitous-}
+import SmplLoop                ( simplExpr )
 
-import SimplMonad
-import SimplEnv
-import PlainCore
-import TaggedCore
-import BasicLit                ( isNoRepLit )
-
-import AbsUniType      ( getUniDataTyCon, getUniDataTyCon_maybe,
-                         getTyConFamilySize, isPrimType
-                       )
-import BinderInfo      ( oneTextualOcc, oneSafeOcc )
 import CgCompInfo      ( uNFOLDING_USE_THRESHOLD,
                          uNFOLDING_CON_DISCOUNT_WEIGHT
                        )
-import CmdLineOpts     ( switchIsOn, intSwitchSet, SimplifierSwitch(..) )
-import Id              ( getIdUniType, getIdInfo )
-import IdInfo
-import Maybes          ( maybeToBool, Maybe(..) )
-import Simplify                ( simplExpr )
-import SimplUtils      ( simplIdWantsToBeINLINEd )
-import MagicUFs
-import Pretty
-import Util
+import CmdLineOpts     ( intSwitchSet, switchIsOn, SimplifierSwitch(..) )
+import CoreSyn
+import CoreUnfold      ( UnfoldingDetails(..), UnfoldingGuidance(..),
+                         FormSummary(..)
+                       )
+import Id              ( idType, getIdInfo,
+                         GenId{-instance Outputable-}
+                       )
+import IdInfo          ( DeforestInfo(..) )
+import Literal         ( isNoRepLit )
+import MagicUFs                ( applyMagicUnfoldingFun, MagicUnfoldingFun )
+import PprStyle                ( PprStyle(..) )
+import PprType         ( GenType{-instance Outputable-} )
+import Pretty          ( ppBesides, ppStr )
+import SimplEnv
+import SimplMonad
+import TyCon           ( tyConFamilySize )
+import Type            ( isPrimType, getAppDataTyCon, maybeAppDataTyCon )
+import Util            ( pprTrace, assertPanic, panic )
 \end{code}
 
 %************************************************************************
@@ -50,23 +51,23 @@ completeVar :: SimplEnv -> OutId -> [OutArg] -> SmplM OutExpr
 
 completeVar env var args
   = let
-       boring_result = applyToArgs (CoVar var) args
+       boring_result = mkGenApp (Var var) args
     in
     case (lookupUnfolding env var) of
-     
-      LiteralForm lit 
-       | not (isNoRepLit lit) 
+
+      LitForm lit
+       | not (isNoRepLit lit)
                -- Inline literals, if they aren't no-repish things
        -> ASSERT( null args )
-          returnSmpl (CoLit lit)
+          returnSmpl (Lit lit)
 
-      ConstructorForm con ty_args val_args
+      ConForm con args
                -- Always inline constructors.
                -- See comments before completeLetBinding
        -> ASSERT( null args )
-          returnSmpl (CoCon con ty_args val_args)      
+          returnSmpl (Con con args)
 
-      GeneralForm txt_occ form_summary template guidance 
+      GenForm txt_occ form_summary template guidance
        -> considerUnfolding env var args
                             txt_occ form_summary template guidance
 
@@ -74,7 +75,7 @@ completeVar env var args
        ->  applyMagicUnfoldingFun magic_fun env args `thenSmpl` \ result ->
            case result of
              Nothing           -> returnSmpl boring_result
-             Just magic_result -> 
+             Just magic_result ->
                {- pprTrace "MagicForm:- " (ppAbove
                        (ppBesides [
                           ppr PprDebug var,
@@ -86,7 +87,8 @@ completeVar env var args
                tick MagicUnfold                `thenSmpl_`
                returnSmpl magic_result
 
-      IWantToBeINLINEd _ -> returnSmpl boring_result
+-- LATER:
+--    IWantToBeINLINEd _ -> returnSmpl boring_result
 
       other -> returnSmpl boring_result
 \end{code}
@@ -123,7 +125,7 @@ considerUnfolding
        -> FormSummary
        -> InExpr               -- Template for unfolding;
        -> UnfoldingGuidance    -- To help us decide...
-       -> SmplM PlainCoreExpr  -- Result!
+       -> SmplM CoreExpr       -- Result!
 
 considerUnfolding env var args txt_occ form_summary template guidance
   | switchIsOn sw_chkr EssentialUnfoldingsOnly
@@ -139,7 +141,7 @@ considerUnfolding env var args txt_occ form_summary template guidance
   = go_for_it
 
   | (case form_summary of {BottomForm -> True; other -> False} &&
-    not (any isPrimType [ ty | (TypeArg ty) <- args ]))
+    not (any isPrimType [ ty | (TyArg ty) <- args ]))
                -- Always inline bottoming applications, unless
                -- there's a primitive type lurking around...
   = go_for_it
@@ -170,7 +172,7 @@ considerUnfolding env var args txt_occ form_summary template guidance
              dont_go_for_it
 
           else if n_vals_wanted == 0
-               && looks_like_a_data_val_to_me then
+               && rhs_looks_like_a_Con then
              -- we are very keen on inlining data values
              -- (see comments elsewhere); we ignore any size issues!
              go_for_it
@@ -197,19 +199,22 @@ considerUnfolding env var args txt_occ form_summary template guidance
     con_discount  -- ToDo: ************ get from a switch *********
       = uNFOLDING_CON_DISCOUNT_WEIGHT
 
-    (tyargs, valargs, args_left) = decomposeArgs args
+    (_, _, tyargs, valargs) = collectArgs args_in_dummy_expr
     no_tyargs  = length tyargs
     no_valargs = length valargs
+    args_in_dummy_expr = mkGenApp (Var (panic "SimplVar.dummy")) args
+    -- we concoct this dummy expr, just so we can use collectArgs
+    -- (rather than make up a special-purpose bit of code)
 
-    looks_like_a_data_val_to_me
+    rhs_looks_like_a_Con
       = let
-           (_,val_binders,body) = digForLambdas template
+           (_,_,val_binders,body) = collectBinders template
        in
        case (val_binders, body) of
-         ([], CoCon _ _ _) -> True
+         ([], Con _ _) -> True
          other -> False
 
-    dont_go_for_it = returnSmpl (applyToArgs (CoVar var) args)
+    dont_go_for_it = returnSmpl (mkGenApp (Var var) args)
 
     go_for_it      = --pprTrace "unfolding:" (ppCat [ppr PprDebug var, ppChar ':', ppr PprDebug template]) (
                     tick UnfoldingDone         `thenSmpl_`
@@ -233,8 +238,8 @@ discountedCost
        -> Int              -- the size/cost of the expr
        -> Int              -- the number of val args (== length args)
        -> ArgInfoVector    -- what we know about the *use* of the arguments
-       -> [OutAtom]        -- *an actual set of value arguments*!
-       -> Int              
+       -> [OutArg]         -- *an actual set of value arguments*!
+       -> Int
 
     -- If we apply an expression (usually a function) of given "costs"
     -- to a particular set of arguments (possibly none), what will
@@ -252,9 +257,8 @@ discountedCost env con_discount_weight size no_args is_con_vec args
       = let
            full_price           = disc size
            take_something_off v = let
-                                    (tycon, _, _) = getUniDataTyCon (getIdUniType v)
-                                    no_cons = case (getTyConFamilySize tycon) of
-                                                Just n -> n
+                                    (tycon, _, _) = getAppDataTyCon (idType v)
+                                    no_cons = tyConFamilySize tycon
                                     reduced_size
                                       = size - (no_cons * con_discount_weight)
                                   in
@@ -264,10 +268,10 @@ discountedCost env con_discount_weight size no_args is_con_vec args
            full_price
        else
            case arg of
-             CoLitAtom _ -> full_price
-             CoVarAtom v -> case lookupUnfolding env v of
-                              ConstructorForm _ _ _ -> take_something_off v
-                              other_form            -> full_price
+             LitArg _ -> full_price
+             VarArg v -> case lookupUnfolding env v of
+                              ConForm _ _ -> take_something_off v
+                              other_form  -> full_price
 
        ) want_cons rest_args
 \end{code}
@@ -280,7 +284,7 @@ leastItCouldCost
        -> Int              -- the size/cost of the expr
        -> Int              -- number of value args
        -> ArgInfoVector    -- what we know about the *use* of the arguments
-       -> [UniType]        -- NB: actual arguments *not* looked at;
+       -> [Type]           -- NB: actual arguments *not* looked at;
                            -- but we know their types
        -> Int
 
@@ -298,7 +302,7 @@ leastItCouldCost con_discount_weight size no_val_args is_con_vec arg_tys
       = let
            take_something_off tycon
              = let
-                   no_cons = case (getTyConFamilySize tycon) of { Just n -> n }
+                   no_cons = tyConFamilySize tycon
 
                    reduced_size
                      = size - (no_cons * con_discount_weight)
@@ -308,9 +312,9 @@ leastItCouldCost con_discount_weight size no_val_args is_con_vec arg_tys
        if not want_con_here then
            disc size want_cons rest_arg_tys
        else
-           case (getUniDataTyCon_maybe arg_ty, isPrimType arg_ty) of
+           case (maybeAppDataTyCon arg_ty, isPrimType arg_ty) of
              (Just (tycon, _, _), False) ->
-               disc (take_something_off tycon) want_cons rest_arg_tys
+               disc (take_something_off tycon) want_cons rest_arg_tys
 
              other -> disc size want_cons rest_arg_tys
 \end{code}