diff options
| author | krasimir <krasimir@chalmers.se> | 2009-11-07 15:18:25 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2009-11-07 15:18:25 +0000 |
| commit | 7c513609f03c5719e0a15c61b7d44abc8d6b56d6 (patch) | |
| tree | 0ec34ce080dbe305e5ac253e0d87073b74c5ac40 /src/GF/Compile/Optimize.hs | |
| parent | ea49556395d854401344a622ea91c8a948dfc8b8 (diff) | |
bugfix: if a concrete module has operations then they also should be optimized
Diffstat (limited to 'src/GF/Compile/Optimize.hs')
| -rw-r--r-- | src/GF/Compile/Optimize.hs | 62 |
1 files changed, 21 insertions, 41 deletions
diff --git a/src/GF/Compile/Optimize.hs b/src/GF/Compile/Optimize.hs index 85195b516..ed22cc165 100644 --- a/src/GF/Compile/Optimize.hs +++ b/src/GF/Compile/Optimize.hs @@ -42,49 +42,21 @@ import Debug.Trace -- | partial evaluation of concrete syntax. AR 6\/2001 -- 16\/5\/2003 -- 5\/2\/2005. optimizeModule :: Options -> [SourceModule] -> SourceModule -> Err SourceModule -optimizeModule opts ms mo@(name,mi) +optimizeModule opts ms m@(name,mi) | mstatus mi == MSComplete = do - mo1 <- case mtype mi of - _ | isModRes mi -> do - ids <- topoSortJments mo - if OptExpand `Set.member` optim - then do mi <- foldM evalOp mi ids - return (name,mi) - else return mo - MTConcrete a -> do - js' <- mapMTree (evalCncInfo oopts gr name a) (jments mi) - return (name,replaceJudgements mi js') - _ -> return mo - return (shareModule optim mo1) - | otherwise = return mo + ids <- topoSortJments m + mi <- foldM updateEvalInfo mi ids + return (shareModule oopts (name,mi)) + | otherwise = return m where - oopts = opts `addOptions` flagsModule mo - optim = flag optOptimizations oopts - - gr = MGrammar $ mo : ms + oopts = opts `addOptions` flagsModule m - evalOp mi (i,info) = do - info' <- evalResInfo oopts gr (i,info) + updateEvalInfo mi (i,info) = do + info' <- evalInfo oopts ms m i info return (updateModule mi i info') --- | only operations need be compiled in a resource, and this is local to each --- definition since the module is traversed in topological order -evalResInfo :: Options -> SourceGrammar -> (Ident,Info) -> Err Info -evalResInfo oopts gr (c,info) = case info of - - ResOper pty pde -> eIn (text "operation") $ do - pde' <- case pde of - Just de -> liftM Just $ computeConcrete gr de - Nothing -> return Nothing - return $ ResOper pty pde' - - _ -> return info - where - eIn cat = errIn (render (text "Error optimizing" <+> cat <+> ppIdent c <+> colon)) - - -evalCncInfo :: Options -> SourceGrammar -> Ident -> Ident -> (Ident,Info) -> Err Info -evalCncInfo opts gr cnc abs (c,info) = do +evalInfo :: Options -> [SourceModule] -> SourceModule -> Ident -> Info -> Err Info +evalInfo opts ms m c info = do (if verbAtLeast opts Verbose then trace (" " ++ showIdent c) else id) return () @@ -93,7 +65,7 @@ evalCncInfo opts gr cnc abs (c,info) = do CncCat ptyp pde ppr -> do pde' <- case (ptyp,pde) of (Just typ, Just de) -> - liftM Just $ pEval ([(Explicit, varStr, typeStr)], typ) de + liftM Just $ partEval opts gr ([(Explicit, varStr, typeStr)], typ) de (Just typ, Nothing) -> liftM Just $ mkLinDefault gr typ >>= partEval noOptions gr ([(Explicit, varStr, typeStr)],typ) _ -> return pde -- indirection @@ -105,14 +77,22 @@ evalCncInfo opts gr cnc abs (c,info) = do CncFun (mt@(Just (_,cont,val))) pde ppr -> --trace (prt c) $ eIn (text "linearization in type" <+> ppTerm Unqualified 0 (mkProd cont val []) $$ text "of function") $ do pde' <- case pde of - Just de -> liftM Just $ pEval (cont,val) de + Just de -> liftM Just $ partEval opts gr (cont,val) de Nothing -> return pde ppr' <- liftM Just $ evalPrintname gr c ppr pde' return $ CncFun mt pde' ppr' -- only cat in type actually needed + ResOper pty pde + | OptExpand `Set.member` optim -> do + pde' <- case pde of + Just de -> liftM Just $ computeConcrete gr de + Nothing -> return Nothing + return $ ResOper pty pde' + _ -> return info where - pEval = partEval opts gr + gr = MGrammar (m : ms) + optim = flag optOptimizations opts eIn cat = errIn (render (text "Error optimizing" <+> cat <+> ppIdent c <+> colon)) -- | the main function for compiling linearizations |
