aboutsummaryrefslogtreecommitdiff
path: root/ReplaceRefs.hs
blob: 821952b4d314e83e1de1ce32ffa0c1efac40b4c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
module ReplaceRefs
    (replaceRef, replaceRefsIns, replaceRefsTerm, replaceRefsBB, replaceRefsBBList)
    where

import Intermediate


replaceRef :: Ref -> Ref -> Ref -> Ref
replaceRef = trans

replaceRefsIns :: Ref -> Ref -> IRIns -> IRIns
replaceRefsIns from to (IMov a b) = IMov (trans from to a) (trans from to b)
replaceRefsIns from to (IStore a b) = IStore (trans from to a) (trans from to b)
replaceRefsIns from to (ILoad a b) = ILoad (trans from to a) (trans from to b)
replaceRefsIns from to (IAri at a b c) = IAri at (trans from to a) (trans from to b) (trans from to c)
replaceRefsIns from to (ICall n al) = ICall n (map (trans from to) al)
replaceRefsIns from to (ICallr a n al) = ICallr (trans from to a) n (map (trans from to) al)
replaceRefsIns from to (IResize a b) = IResize (trans from to a) (trans from to b)
replaceRefsIns _ _ INop = INop

replaceRefsTerm :: Ref -> Ref -> IRTerm -> IRTerm
replaceRefsTerm from to (IJcc ct a b i1 i2) = IJcc ct (trans from to a) (trans from to b) i1 i2
replaceRefsTerm _ _ (IJmp i) = IJmp i
replaceRefsTerm _ _ IRet = IRet
replaceRefsTerm from to (IRetr a) = IRetr (trans from to a)
replaceRefsTerm _ _ ITermNone = ITermNone

replaceRefsBB :: Ref -> Ref -> BB -> BB
replaceRefsBB from to (BB bid inss term) =
    BB bid (map (replaceRefsIns from to) inss) (replaceRefsTerm from to term)

replaceRefsBBList :: Ref -> Ref -> [BB] -> [BB]
replaceRefsBBList from to bbs = map (\bb -> replaceRefsBB from to bb) bbs


trans :: Ref -> Ref -> Ref -> Ref
trans from to ref
    | ref == from = to
    | otherwise = ref