diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-09-01 18:14:43 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-09-01 18:15:25 +0200 |
commit | 19c70b8eaa1126f1648b009d99092432a5c88059 (patch) | |
tree | bd4171a4d6ef5e8ae2b09e1c84bf3e2346374e97 /Optimiser.hs | |
parent | 3d5d85e00f2a81efb62bb17f8e5db63fe5a49a61 (diff) |
Structs + typedefs
Diffstat (limited to 'Optimiser.hs')
-rw-r--r-- | Optimiser.hs | 51 |
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 |