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/ra/ra.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/ra/ra.sml

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

sml/branches/SMLNJ/src/MLRISC/ra/ra.sml revision 498, Tue Dec 7 15:44:50 1999 UTC sml/trunk/src/MLRISC/ra/ra.sml revision 576, Fri Mar 10 07:27:16 2000 UTC
# Line 58  Line 58 
58     type raClient =     type raClient =
59     { cellkind     : C.cellkind,             (* kind of register *)     { cellkind     : C.cellkind,             (* kind of register *)
60       spillProh    : (C.cell * C.cell) list, (* don't spill these *)       spillProh    : (C.cell * C.cell) list, (* don't spill these *)
61         memRegs      : (C.cell * C.cell) list, (* memory registers *)
62       K            : int,                    (* number of colors *)       K            : int,                    (* number of colors *)
63       dedicated    : bool Array.array,       (* dedicated registers *)       dedicated    : bool Array.array,       (* dedicated registers *)
64       getreg       : getreg,                 (* how to find a color *)       getreg       : getreg,                 (* how to find a color *)
# Line 68  Line 69 
69       reload       : F.Spill.reload,         (* reload callback *)       reload       : F.Spill.reload,         (* reload callback *)
70       reloadDst    : F.Spill.reloadDst,      (* reload callback *)       reloadDst    : F.Spill.reloadDst,      (* reload callback *)
71       renameSrc    : F.Spill.renameSrc,      (* rename callback *)       renameSrc    : F.Spill.renameSrc,      (* rename callback *)
      firstMemReg  : C.cell,  
      numMemRegs   : int,  
72       mode         : mode                    (* mode *)       mode         : mode                    (* mode *)
73     }     }
74    
# Line 78  Line 77 
77     val NO_OPTIMIZATION   = 0wx0     val NO_OPTIMIZATION   = 0wx0
78     val DEAD_COPY_ELIM    = Core.DEAD_COPY_ELIM     val DEAD_COPY_ELIM    = Core.DEAD_COPY_ELIM
79     val BIASED_SELECTION  = Core.BIASED_SELECTION     val BIASED_SELECTION  = Core.BIASED_SELECTION
80       val HAS_PARALLEL_COPIES    = Core.HAS_PARALLEL_COPIES
81     val SPILL_COALESCING  = 0wx100     val SPILL_COALESCING  = 0wx100
82     val SPILL_COLORING    = 0wx200     val SPILL_COLORING    = 0wx200
83     val SPILL_PROPAGATION = 0wx400     val SPILL_PROPAGATION = 0wx400
# Line 95  Line 95 
95     val cfg_before_ra     = MLRiscControl.getFlag "dump-cfg-before-ra"     val cfg_before_ra     = MLRiscControl.getFlag "dump-cfg-before-ra"
96     val cfg_after_ra      = MLRiscControl.getFlag "dump-cfg-after-ra"     val cfg_after_ra      = MLRiscControl.getFlag "dump-cfg-after-ra"
97     val cfg_after_spill   = MLRiscControl.getFlag "dump-cfg-after-spilling"     val cfg_after_spill   = MLRiscControl.getFlag "dump-cfg-after-spilling"
98       val cfg_before_ras    = MLRiscControl.getFlag "dump-cfg-before-all-ra"
99       val cfg_after_ras     = MLRiscControl.getFlag "dump-cfg-after-all-ra"
100     val dump_graph        = MLRiscControl.getFlag "dump-interference-graph"     val dump_graph        = MLRiscControl.getFlag "dump-interference-graph"
101     val debug_spill       = MLRiscControl.getFlag "ra-debug-spilling"     val debug_spill       = MLRiscControl.getFlag "ra-debug-spilling"
102     val ra_count          = MLRiscControl.getCounter "ra-count"     val ra_count          = MLRiscControl.getCounter "ra-count"
# Line 140  Line 142 
142         fun regalloc{getreg, K, dedicated, copyInstr,         fun regalloc{getreg, K, dedicated, copyInstr,
143                      spill, spillSrc, spillCopyTmp, renameSrc,                      spill, spillSrc, spillCopyTmp, renameSrc,
144                      reload, reloadDst, spillProh, cellkind, mode,                      reload, reloadDst, spillProh, cellkind, mode,
145                      firstMemReg, numMemRegs} =                      memRegs} =
146         let val numCell = C.numCell cellkind ()         let val numCell = C.numCell cellkind ()
147         in  if numCell = 0         in  if numCell = 0
148         then ()         then ()
# Line 150  Line 152 
152    
153             (* the nodes table *)             (* the nodes table *)
154             val nodes  = Intmap.new(numCell,NodeTable)             val nodes  = Intmap.new(numCell,NodeTable)
155               val mode   = if isOn(HAS_PARALLEL_COPIES, mode) then
156                               Word.orb(Core.SAVE_COPY_TEMPS, mode)
157                            else mode
158             (* create an empty interference graph *)             (* create an empty interference graph *)
159             val G      = G.newGraph{nodes=nodes,             val G      = G.newGraph{nodes=nodes,
160                                     K=K,                                     K=K,
# Line 165  Line 170 
170                                     mode=Word.orb(Flowgraph.mode,                                     mode=Word.orb(Flowgraph.mode,
171                                           Word.orb(mode,SpillHeuristics.mode)),                                           Word.orb(mode,SpillHeuristics.mode)),
172                                     spillLoc=spillLoc,                                     spillLoc=spillLoc,
173                                     firstMemReg=firstMemReg,                                     memRegs=memRegs
                                    numMemRegs=numMemRegs  
174                                    }                                    }
175             val G.GRAPH{spilledRegs, pseudoCount, spillFlag, ...} = G             val G.GRAPH{spilledRegs, pseudoCount, spillFlag, ...} = G
176    
# Line 234  Line 238 
238                                " uses="^Int.toString(length(!uses))^"\n"                                " uses="^Int.toString(length(!uses))^"\n"
239                               )                               )
240                    ) else ();                    ) else ();
241                 {node=node,spillWkl=spillWkl}                 {node=node,cost=cost,spillWkl=spillWkl}
242             end             end
243    
244             (*             (*
# Line 272  Line 276 
276                 val _ = if isOn(mode,SPILL_PROPAGATION+SPILL_COALESCING) then                 val _ = if isOn(mode,SPILL_PROPAGATION+SPILL_COALESCING) then
277                            Core.initMemMoves G                            Core.initMemMoves G
278                         else ()                         else ()
279                   (*
280                 val spills = if isOn(mode,SPILL_PROPAGATION) then                 val spills = if isOn(mode,SPILL_PROPAGATION) then
281                                 Core.spillPropagation G spills else spills                                 Core.spillPropagation G spills else spills
282                 val _ = if isOn(mode,SPILL_COALESCING) then                 val _ = if isOn(mode,SPILL_COALESCING) then
# Line 280  Line 285 
285                            Core.spillColoring G spills else ()                            Core.spillColoring G spills else ()
286                 val _ = if isOn(mode,SPILL_COALESCING+SPILL_PROPAGATION) then                 val _ = if isOn(mode,SPILL_COALESCING+SPILL_PROPAGATION) then
287                            markMemRegs spills else ()                            markMemRegs spills else ()
288                    *)
289                 val _ = logGraph("actual spill",G);                 val _ = logGraph("actual spill",G);
290                 val {simplifyWkl,freezeWkl,moveWkl,spillWkl} =                 val {simplifyWkl,freezeWkl,moveWkl,spillWkl} =
291                      Core.initWorkLists G                      Core.initWorkLists G
# Line 327  Line 333 
333                           if !pseudoCount = 0 (* all nodes simplified *)                           if !pseudoCount = 0 (* all nodes simplified *)
334                           then stack                           then stack
335                           else                           else
336                           let val {node,spillWkl} =                           let val {node,cost,spillWkl} =
337                                      chooseVictim{spillWkl=spillWkl}                                      chooseVictim{spillWkl=spillWkl}
338                           in  case node of                           in  case node of
339                                 SOME node => (* spill node and continue *)                                 SOME node => (* spill node and continue *)
340                                 let val _ = if debug then print "-" else ()                                 let val _ = if debug then print "-" else ()
341                                     val {moveWkl,freezeWkl,stack} =                                     val {moveWkl,freezeWkl,stack} =
342                                         potentialSpill{node=node,stack=stack}                                         potentialSpill{node=node,
343                                                          cost=cost,
344                                                          stack=stack}
345                                 in  iterate([],moveWkl,freezeWkl,spillWkl,stack)                                 in  iterate([],moveWkl,freezeWkl,spillWkl,stack)
346                                 end                                 end
347                               | NONE => stack (* nothing to spill *)                               | NONE => stack (* nothing to spill *)
348                           end                           end
349                     end                     end
350    
351                     (* simplify the nodes *)                     val {spills} =
352                           if K = 0 then
353                             {spills=spillWkl}
354                           else
355                             let (* simplify the nodes *)
356                     val stack = iterate                     val stack = iterate
357                            (simplifyWkl,moveWkl,freezeWkl,spillWkl,stack)                            (simplifyWkl,moveWkl,freezeWkl,spillWkl,stack)
358                     (* color the nodes *)                     (* color the nodes *)
359                     val {spills} = (Core.select G) {stack=stack}                           in  (Core.select G) {stack=stack}
360                             end
361                 in  (* check for actual spills *)                 in  (* check for actual spills *)
362                     case spills of                     case spills of
363                       [] => ()                       [] => ()
# Line 384  Line 397 
397         fun regallocs [] = ()         fun regallocs [] = ()
398           | regallocs(p::ps) = (regalloc p; regallocs ps)           | regallocs(p::ps) = (regalloc p; regallocs ps)
399    
400     in  regallocs params;     in  dumpFlowgraph(cfg_before_ras,"before register allocation");
401           regallocs params;
402           dumpFlowgraph(cfg_after_ras,"after register allocation");
403         flowgraph         flowgraph
404     end     end
405    

Legend:
Removed from v.498  
changed lines
  Added in v.576

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