Added a couple of filter calls to the usage checking to speed it up

It now removes empty sets of (relevant) background knowledge to avoid needlessly creating lots of problems (thousands!) when it only needs one, and also stopped it checking array usage when there's at most one written-to/read-from index.

Fixes #90
This commit is contained in:
Neil Brown 2009-04-04 08:52:41 +00:00
parent f755458545
commit c9f9eb8587

View File

@ -34,6 +34,7 @@ module ArrayUsageCheck (
import Control.Monad.Error
import Control.Monad.State
import Data.Array.IArray
import qualified Data.Foldable as F
import Data.Generics hiding (GT)
import Data.Int
import Data.List
@ -98,8 +99,10 @@ findRepSolutions reps bks
-- for any overlapping array indices.
checkArrayUsage :: forall m. (Die m, CSMR m, MonadIO m) => NameAttr -> (Meta, ParItems (BK, UsageLabel)) -> m ()
checkArrayUsage sharedAttr (m,p)
= do indexes <- groupArrayIndexes $ fmap (transformPair id nodeVars) p
mapM_ (checkIndexes m) $ Map.toList indexes
= do debug $ "checkArrayUsage: " ++ show m
indexes <- groupArrayIndexes $ fmap (transformPair id nodeVars) p
mapM_ (checkIndexes m) $ Map.toList $ Map.filter
((<= 1) . length . map (\(_,w,r) -> w++r) . F.toList) indexes
where
getDecl :: UsageLabel -> Maybe String
getDecl = join . fmap getScopeIn . nodeDecl
@ -172,7 +175,7 @@ checkArrayUsage sharedAttr (m,p)
Right [] -> return () -- No problems to work with
Right problems -> do
probs <- formatProblems [(vm, prob) | (_,vm,prob) <- problems]
debug $ "Problems in checkArrayUsage:\n" ++ probs
debug $ "Problems in checkArrayUsage" ++ show m ++ ":\n" ++ probs
case mapMaybe solve problems of
-- No solutions; no worries!
[] -> return ()
@ -544,7 +547,9 @@ makeEquations accesses bound
where
lookupBK :: [A.Name] -> (A.Expression, [ModuloCase], BK') -> Either String
[(EqualityProblem, InequalityProblem)]
lookupBK reps (e,_,bk) = mapM (foldl (liftM2 accumProblem) (return ([],[])) . map snd .
lookupBK reps (e,_,bk) = liftM (filter (\x ->
(not $ null $ fst x) || (not $ null $ snd x))) $
mapM (foldl (liftM2 accumProblem) (return ([],[])) . map snd .
filter (\(v,_) -> v `elem` vs || v `elem` reps') . Map.toList) bk
where
reps' :: [Var]