1
1
module PPA.Analysis.AvailableExpressions where
2
2
3
+ import Prelude hiding (init )
4
+
3
5
import qualified Data.Set as Set
6
+ import qualified Data.List as List
7
+ import qualified Data.Array.IArray as Array
4
8
5
9
import PPA.Lang.While
6
10
import PPA.Lang.While.Util
7
11
12
+ type AE = Set. Set AExp
13
+
14
+ type VecAE = Array. Array Integer AE
15
+ type VecF = Array. Array Integer (Solution -> AE )
16
+
17
+ data Solution = Solution { entryAE :: VecAE
18
+ , exitAE :: VecAE
19
+ } deriving (Show , Eq )
20
+
21
+ data Solver = Solver { entryF :: VecF
22
+ , exitF :: VecF
23
+ }
24
+
25
+ genIter :: Integer -> Solver -> Solution -> Solution
26
+ genIter l s rd = Solution { entryAE = entries, exitAE = exits }
27
+ where
28
+ entries = Array. array (1 , l) [ (i, ((entryF s) Array. ! i) rd) | i <- [1 .. l]]
29
+ exits = Array. array (1 , l) [ (i, ((exitF s) Array. ! i) rd) | i <- [1 .. l]]
30
+
31
+ -- compute fixpoint
32
+ fix :: (Eq a ) => a -> (a -> a ) -> a
33
+ fix start f =
34
+ if start == next then
35
+ start
36
+ else
37
+ fix next f
38
+ where
39
+ next = f start
40
+
41
+
8
42
kill :: Stmt -> Lab -> Set. Set AExp
9
43
kill s l =
10
44
case bf l of
@@ -24,3 +58,25 @@ gen s l =
24
58
where
25
59
bf :: Lab -> Block
26
60
bf = blockMap $ blocks s
61
+
62
+ ae :: Stmt -> Solution
63
+ ae s =
64
+ fix start $ genIter sz solver
65
+ where
66
+ start = Solution { entryAE = upper, exitAE = upper }
67
+ where
68
+ upper :: VecAE
69
+ upper = Array. array (1 , sz) [(i, aExp s) | i <- [1 .. sz]]
70
+ solver = Solver { entryF = aeEntry, exitF = aeExit }
71
+ where
72
+ aeEntry :: VecF
73
+ aeEntry = Array. array (1 , sz) [(i, (\ ae ->
74
+ if i == init s then
75
+ Set. empty
76
+ else
77
+ List. foldl Set. intersection (aExp s) [(exitAE ae) Array. ! l' | (l', l) <- Set. toList $ flow s, l == i])) | i <- [1 .. sz]]
78
+ aeExit :: VecF
79
+ aeExit = Array. array (1 , sz) [(i, (\ ae ->
80
+ Set. union (((entryAE ae) Array. ! i) Set. \\ (kill s i)) (gen s i))) | i <- [1 .. sz]]
81
+ sz :: Integer
82
+ sz = toInteger $ Set. size $ labels s
0 commit comments