Skip to content

Commit 4740b0f

Browse files
committed
Really rough implementation of available expressions
1 parent d8776cd commit 4740b0f

File tree

3 files changed

+58
-35
lines changed

3 files changed

+58
-35
lines changed

ppa.cabal

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ extra-source-files: README.md
1717
cabal-version: >=1.10
1818

1919
library
20-
exposed-modules: PPA.Lang.While PPA.Lang.While.Internal PPA.Lang.While.Util PPA.Analysis.Util PPA.Analysis.AvailableExpressions
20+
exposed-modules: PPA.Lang.While PPA.Lang.While.Internal PPA.Lang.While.Util PPA.Analysis.AvailableExpressions
2121
-- other-modules:
2222
other-extensions: FlexibleContexts
23-
build-depends: base == 4.8.*, parsec == 3.1.*, containers == 0.5.*
23+
build-depends: base == 4.8.*, parsec == 3.1.*, containers == 0.5.*, array == 0.5.*
2424
hs-source-dirs: src
2525
default-language: Haskell2010
2626

src/PPA/Analysis/AvailableExpressions.hs

+56
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,44 @@
11
module PPA.Analysis.AvailableExpressions where
22

3+
import Prelude hiding (init)
4+
35
import qualified Data.Set as Set
6+
import qualified Data.List as List
7+
import qualified Data.Array.IArray as Array
48

59
import PPA.Lang.While
610
import PPA.Lang.While.Util
711

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+
842
kill :: Stmt -> Lab -> Set.Set AExp
943
kill s l =
1044
case bf l of
@@ -24,3 +58,25 @@ gen s l =
2458
where
2559
bf :: Lab -> Block
2660
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

src/PPA/Analysis/Util.hs

-33
This file was deleted.

0 commit comments

Comments
 (0)