summaryrefslogtreecommitdiff
path: root/Optimiser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Optimiser.hs')
-rw-r--r--Optimiser.hs37
1 files changed, 4 insertions, 33 deletions
diff --git a/Optimiser.hs b/Optimiser.hs
index f09128f..42ebdb1 100644
--- a/Optimiser.hs
+++ b/Optimiser.hs
@@ -127,8 +127,8 @@ deadBBElim gfds bbs =
deadStoreElim :: [BB] -> [BB]
deadStoreElim bbs = [BB bid (filter (not . shouldRemove) inss) term | BB bid inss term <- bbs]
where
- readtemps = Set.fromList (concatMap readTempsBB bbs)
- alltemps = readtemps <> Set.fromList (concatMap writtenTempsBB bbs)
+ readtemps = Set.fromList (concatMap bbReadTemps bbs)
+ alltemps = readtemps <> Set.fromList (concatMap bbWrittenTemps bbs)
elim = alltemps Set.\\ readtemps
shouldRemove :: Instruction -> Bool
@@ -151,7 +151,7 @@ deadStoreElim bbs = [BB bid (filter (not . shouldRemove) inss) term | BB bid ins
tailCallIntro :: [BB] -> [BB]
tailCallIntro bbs = map introduce bbs
where
- readInBB = map (Set.fromList . readTempsBB) bbs
+ readInBB = map (Set.fromList . bbReadTemps) bbs
readBefore = init $ scanl (<>) Set.empty readInBB
readAfter = tail $ scanr (<>) Set.empty readInBB
readInOthers = Map.fromList [(bid, before <> after)
@@ -163,7 +163,7 @@ tailCallIntro bbs = map introduce bbs
((RTemp i1, ICallC cl as), IRet (RTemp i2))
| i1 == i2
, i1 `Set.notMember` (readInOthers Map.! bid)
- , i1 `notElem` concatMap (readTempsIC . snd) (init inss) ->
+ , i1 `notElem` onlyTemporaries (concatMap (allRefs . snd) (init inss)) ->
BB bid (init inss) (ITailC cl as)
_ -> orig
@@ -178,34 +178,5 @@ dedupDatas (IRProgram origbbs gfds datatbl) = IRProgram (map goBB origbbs) gfds
goI (ref, IData i) = (ref, IData (valueIdx Map.! (datatbl !! i)))
goI ins = ins
-readTempsBB :: BB -> [Int]
-readTempsBB (BB _ inss term) = concatMap (readTempsIC . snd) inss ++ readTempsT term
-
-writtenTempsBB :: BB -> [Int]
-writtenTempsBB (BB _ inss _) = concatMap (readTempsR . fst) inss
-
-readTempsIC :: InsCode -> [Int]
-readTempsIC (IAssign r) = readTempsR r
-readTempsIC (IParam _) = []
-readTempsIC (IClosure _) = []
-readTempsIC (IData _) = []
-readTempsIC (ICallC r rs) = readTempsR r ++ concatMap readTempsR rs
-readTempsIC (IAllocClo _ rs) = concatMap readTempsR rs
-readTempsIC (IDiscard _) = []
-
-readTempsT :: Terminator -> [Int]
-readTempsT (IBr r _ _) = readTempsR r
-readTempsT (IJmp _) = []
-readTempsT (IRet r) = readTempsR r
-readTempsT (ITailC r rs) = readTempsR r ++ concatMap readTempsR rs
-readTempsT IExit = []
-readTempsT IUnknown = []
-
-readTempsR :: Ref -> [Int]
-readTempsR (RConst _) = []
-readTempsR (RTemp i) = [i]
-readTempsR (RSClo _) = []
-readTempsR RNone = []
-
mapFoldl :: (s -> a -> (s, b)) -> s -> [a] -> (s, [b])
mapFoldl f s = fmap reverse . foldl' (\(s', yet) x -> fmap (: yet) (f s' x)) (s, [])