aboutsummaryrefslogtreecommitdiff
path: root/Optimiser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Optimiser.hs')
-rw-r--r--Optimiser.hs51
1 files changed, 19 insertions, 32 deletions
diff --git a/Optimiser.hs b/Optimiser.hs
index cea0601..408bd24 100644
--- a/Optimiser.hs
+++ b/Optimiser.hs
@@ -149,7 +149,7 @@ identityOps (IRFunc rt name al bbs sid) = IRFunc rt name al (map go bbs) sid
constantPropagate :: FuncOptimisation
constantPropagate (IRFunc rt name al bbs sid) = IRFunc rt name al bbs' sid
where
- alltemps = findAllTemps' bbs
+ alltemps = findAllTempsBBList bbs
consttemps = catMaybes $ flip map alltemps $ \ref ->
let locs = findMutations' bbs ref
loc = head locs
@@ -214,6 +214,14 @@ movPush (IRFunc rt name al bbs sid) = IRFunc rt name al (map goBB bbs) sid
| d' == d = ILoad d' (replaceRef d s s') : go rest term
| d' == s = IMov d s : ILoad d' (replaceRef d s s') : go rest term
| otherwise = ILoad d' (replaceRef d s s') : push mov rest term
+ push mov@(d, s) (ISet d' n' s' : rest) term
+ | d' == d = ISet d' n' (replaceRef d s s') : go rest term
+ | d' == s = IMov d s : ISet d' n' s' : go rest term
+ | otherwise = ISet d' n' (replaceRef d s s') : push mov rest term
+ push mov@(d, s) (IGet d' s' n' : rest) term
+ | d' == d = IGet d' (replaceRef d s s') n' : go rest term
+ | d' == s = IMov d s : IGet d' s' n' : go rest term
+ | otherwise = IGet d' (replaceRef d s s') n' : push mov rest term
push mov@(d, s) (IAri at d' s1' s2' : rest) term
| d' == d = IAri at d' (replaceRef d s s1') (replaceRef d s s2') : go rest term
| d' == s = IMov d s : IAri at d' (replaceRef d s s1') (replaceRef d s s2') : go rest term
@@ -294,6 +302,12 @@ arithPush (IRFunc rt name al allbbs sid) = IRFunc rt name al resbbs sid
propagate ari@(_, d, s1, s2) (Left ins@(ILoad md _) : rest)
| d /= md && md /= s1 && md /= s2 = fmap (Left ins :) $ propagate ari rest
| otherwise = (False, Left ins : rest)
+ propagate ari@(_, d, s1, s2) (Left ins@(ISet md _ _) : rest)
+ | d /= md && md /= s1 && md /= s2 = fmap (Left ins :) $ propagate ari rest
+ | otherwise = (False, Left ins : rest)
+ propagate ari@(_, d, s1, s2) (Left ins@(IGet md _ _) : rest)
+ | d /= md && md /= s1 && md /= s2 = fmap (Left ins :) $ propagate ari rest
+ | otherwise = (False, Left ins : rest)
propagate ari@(at, d, s1, s2) (Left ins@(IAri mat md ms1 ms2) : rest)
| d /= md && (at, s1, s2) == (mat, ms1, ms2) = fmap (Left (IMov md d) :) $ propagate ari rest
| d /= md && md /= s1 && md /= s2 = fmap (Left ins :) $ propagate ari rest
@@ -398,6 +412,8 @@ removeUnusedInstructions (IRFunc rt name al bbs sid) = IRFunc rt name al (map go
goI ins@(ILea d _) = pureInstruction d ins
goI ins@(IStore _ _) = Just ins
goI ins@(ILoad d _) = pureInstruction d ins
+ goI ins@(ISet _ _ _) = Just ins
+ goI ins@(IGet d _ _) = pureInstruction d ins
goI ins@(IAri _ d _ _) = pureInstruction d ins
goI ins@(ICall _ _) = Just ins
goI ins@(ICallr _ _ _) = Just ins
@@ -559,39 +575,10 @@ findMentions' bbs ref =
-- findMentionsIns' :: [BB] -> Ref -> [IRIns]
-- findMentionsIns' bbs ref = concatMap (flip findMentionsIns ref) bbs
-findAllRefs :: BB -> [Ref]
-findAllRefs (BB _ inss _) = findAllRefsInss inss
-
-findAllRefsInss :: [IRIns] -> [Ref]
-findAllRefsInss inss = uniq $ sort $ concatMap findAllRefsIns inss
-
-findAllRefsIns :: IRIns -> [Ref]
-findAllRefsIns (IMov a b) = [a, b]
-findAllRefsIns (ILea a _) = [a]
-findAllRefsIns (IStore a b) = [a, b]
-findAllRefsIns (ILoad a b) = [a, b]
-findAllRefsIns (IAri _ a b c) = [a, b, c]
-findAllRefsIns (ICall _ al) = al
-findAllRefsIns (ICallr a _ al) = a : al
-findAllRefsIns (IResize a b) = [a, b]
-findAllRefsIns IDebugger = []
-findAllRefsIns INop = []
-
-findAllRefsTerm :: IRTerm -> [Ref]
-findAllRefsTerm (IJcc _ a b _ _) = [a, b]
-findAllRefsTerm (IJmp _) = []
-findAllRefsTerm IRet = []
-findAllRefsTerm (IRetr a) = [a]
-findAllRefsTerm IUnreachable = []
-findAllRefsTerm ITermNone = undefined
-
--- findAllRefs' :: [BB] -> [Ref]
--- findAllRefs' = uniq . sort . concatMap findAllRefs
-
findAllTemps :: BB -> [Ref]
findAllTemps bb = flip filter (findAllRefs bb) $ \ref -> case ref of
(Temp _ _) -> True
_ -> False
-findAllTemps' :: [BB] -> [Ref]
-findAllTemps' = concatMap findAllTemps
+findAllTempsBBList :: [BB] -> [Ref]
+findAllTempsBBList = concatMap findAllTemps