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

SCM Repository

[smlnj] Diff of /sml/trunk/src/MLRISC/IR/mlrisc-cfg-util.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/IR/mlrisc-cfg-util.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 428, Wed Sep 8 09:47:00 1999 UTC revision 429, Wed Sep 8 09:47:00 1999 UTC
# Line 83  Line 83 
83                    in  insns := P.setTargets(jmp,[labelOf i,labelOf j])::rest                    in  insns := P.setTargets(jmp,[labelOf i,labelOf j])::rest
84                    end                    end
85               |  es =>               |  es =>
86                    let fun cmp ((_,_,CFG.EDGE{k=CFG.SWITCH i,...}),                    let fun gt ((_,_,CFG.EDGE{k=CFG.SWITCH i,...}),
87                                 (_,_,CFG.EDGE{k=CFG.SWITCH j,...})) = i < j                                (_,_,CFG.EDGE{k=CFG.SWITCH j,...})) = i > j
88                          | cmp _ = error "cmp"                          | gt _ = error "gt"
89                        val es = Sorting.sort cmp es                        val es = ListMergeSort.sort gt es
90                        val labels = map (fn (_,j,_) => labelOf j) es                        val labels = map (fn (_,j,_) => labelOf j) es
91                    in  insns := P.setTargets(jmp,labels)::rest;                    in  insns := P.setTargets(jmp,labels)::rest;
92                        error "updateJumpLabel"                        error "updateJumpLabel"
# Line 183  Line 183 
183      *  Split a control flow edge, return a new edge and the new block      *  Split a control flow edge, return a new edge and the new block
184      *      *
185      *=====================================================================*)      *=====================================================================*)
186     fun splitEdge (CFG as G.GRAPH cfg) {edge=(i,j,e as CFG.EDGE{w,...}),jump} =     fun splitEdge (CFG as G.GRAPH cfg)
187                     {kind, edge=(i,j,e as CFG.EDGE{w,...}),jump} =
188     let val k = #new_id cfg ()     let val k = #new_id cfg ()
189         val jump = jump orelse i = j orelse         val jump = jump orelse i = j orelse
190                (case CFG.fallsThruFrom(CFG,j) of                (case CFG.fallsThruFrom(CFG,j) of
191                  NONE => false                  NONE => false
192                | SOME _ => true)                | SOME _ => true)
193         val node as CFG.BLOCK{insns,...} = CFG.newBlock(k,CFG.B.default,ref(!w))         val insns = ref(if jump then [P.jump(labelOf CFG j)] else [])
194           val node =
195               CFG.BLOCK{id=k, kind=kind, name=CFG.B.default,
196                         freq= ref(!w), data=ref [], labels = ref [],
197                         insns=insns, annotations=ref []}
198         val kind = if jump then CFG.JUMP else CFG.FALLSTHRU         val kind = if jump then CFG.JUMP else CFG.FALLSTHRU
        val _    = if jump then insns := [P.jump(labelOf CFG j)] else ()  
199         val edge = (k,j,CFG.EDGE{w=ref(!w),a=ref [],k=kind})         val edge = (k,j,CFG.EDGE{w=ref(!w),a=ref [],k=kind})
200     in  CFG.removeEdge CFG (i,j,e);     in  CFG.removeEdge CFG (i,j,e);
201         #add_edge cfg (i,k,e);         #add_edge cfg (i,k,e);
# Line 208  Line 212 
212      *=====================================================================*)      *=====================================================================*)
213     fun splitAllCriticalEdges (CFG as G.GRAPH cfg) =     fun splitAllCriticalEdges (CFG as G.GRAPH cfg) =
214         (#forall_edges cfg (fn e => if isCriticalEdge CFG e then         (#forall_edges cfg (fn e => if isCriticalEdge CFG e then
215                                       (splitEdge CFG {edge=e,jump=false}; ())            (splitEdge CFG {edge=e,kind=CFG.NORMAL,jump=false}; ())
216                                    else ());                                    else ());
217          CFG.changed CFG          CFG.changed CFG
218         )         )
# Line 304  Line 308 
308    
309     (*=====================================================================     (*=====================================================================
310      *      *
311      *  Merge all edges in the CFG      *  Merge all edges in the CFG.
312        *  Merge higher frequency edges first
313      *      *
314      *=====================================================================*)      *=====================================================================*)
315     fun mergeAllEdges(CFG as G.GRAPH cfg) =     fun mergeAllEdges(CFG as G.GRAPH cfg) =
# Line 312  Line 317 
317         fun higherFreq((_,_,CFG.EDGE{w=x,...}),(_,_,CFG.EDGE{w=y,...}))= !x < !y         fun higherFreq((_,_,CFG.EDGE{w=x,...}),(_,_,CFG.EDGE{w=y,...}))= !x < !y
318         fun mergeAll([],changed) = changed         fun mergeAll([],changed) = changed
319           | mergeAll(e::es,changed) = mergeAll(es,mergeEdge e orelse changed)           | mergeAll(e::es,changed) = mergeAll(es,mergeEdge e orelse changed)
320         val changed = mergeAll(Sorting.sort higherFreq (#edges cfg ()),false)         (* note: sort expects the gt operator and sorts in ascending order *)
321           val changed = mergeAll(ListMergeSort.sort higherFreq (#edges cfg ()),
322                                  false)
323     in  if changed then CFG.changed CFG else ()     in  if changed then CFG.changed CFG else ()
324     end     end
325    

Legend:
Removed from v.428  
changed lines
  Added in v.429

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