Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/MLRISC/IR/mlrisc-liveness.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/IR/mlrisc-liveness.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 222 - (view) (download)
Original Path: sml/branches/SMLNJ/src/MLRISC/IR/mlrisc-liveness.sml

1 : monnier 221 signature LIVENESS_ANALYSIS =
2 :     sig
3 :    
4 :     structure CFG : CONTROL_FLOW_GRAPH
5 :     structure I : INSTRUCTIONS
6 :     sharing CFG.I = I
7 :    
8 :     val liveness :
9 :     { cfg : CFG.cfg,
10 :     liveOut : CFG.block Graph.node -> RegSet.regset,
11 :     defUse : CFG.block Graph.node -> RegSet.regset * RegSet.regset
12 :     } -> unit
13 :    
14 :     val getLiveness : CFG.cfg -> Graph.node_id -> RegSet.regset * RegSet.regset
15 :    
16 :     end
17 :    
18 :     functor LivenessAnalysisFn(CFG : CONTROL_FLOW_GRAPH) : LIVENESS_ANALYSIS =
19 :     struct
20 :    
21 :     structure CFG = CFG
22 :     structure I = CFG.I
23 :     structure A = Annotations
24 :     structure S = RegSet
25 :     structure G = Graph
26 :    
27 :     val {put : (S.regset * S.regset) * A.annotations -> A.annotations,
28 :     get,
29 :     rmv} = A.new()
30 :    
31 :     structure Liveness =
32 :     DataflowFn
33 :     (struct
34 :     structure CFG = CFG
35 :     type domain = S.regset
36 :     val forward = false
37 :     val bot = S.empty
38 :     val == = S.==
39 :     val join = S.union
40 :     val op + = S.+
41 :     val op - = S.-
42 :     type dataflow_info =
43 :     { liveOut : CFG.block Graph.node -> S.regset,
44 :     defUse : CFG.block Graph.node -> S.regset * S.regset
45 :     }
46 :    
47 :     fun prologue(cfg,{defUse,liveOut}) (b,b') =
48 :     let val (def,use) = defUse(b,b')
49 :     val live_out = liveOut(b,b')
50 :     in { input = live_out,
51 :     output = (live_out - def) + use,
52 :     transfer = fn live_out => (live_out - def) + use
53 :     }
54 :     end
55 :    
56 :     fun epilogue _ { node = (_,CFG.BLOCK{annotations,...}),
57 :     input=liveOut, output=liveIn } =
58 :     annotations := put((liveIn,liveOut),!annotations)
59 :     end
60 :     )
61 :    
62 :     fun liveness {cfg,liveOut,defUse} =
63 :     (Liveness.analyze(cfg,{liveOut=liveOut,defUse=defUse}); ())
64 :    
65 :     fun getLiveness (G.GRAPH cfg) b =
66 :     let val CFG.BLOCK{annotations,...} = #node_info cfg b
67 :     in case get(!annotations) of
68 :     SOME x => x
69 :     | NONE => (S.empty,S.empty)
70 :     end
71 :    
72 :     end
73 :    
74 :     (*
75 :     * $Log: mlrisc-liveness.sml,v $
76 :     * Revision 1.1.1.1 1998/11/16 21:46:54 george
77 :     * Version 110.10
78 :     *
79 :     *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0