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

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

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

revision 651, Thu Jun 1 18:34:03 2000 UTC revision 705, Wed Sep 27 18:44:44 2000 UTC
# Line 54  Line 54 
54    
55     exception NotThere     exception NotThere
56    
    (*  
    val Asm.S.STREAM{emit, ...} = Asm.makeStream []  
     *)  
   
57     val dummyLabel = F.LABEL(Label.Label{id= ~1, addr=ref ~1, name=""})     val dummyLabel = F.LABEL(Label.Label{id= ~1, addr=ref ~1, name=""})
58    
59     fun x + y = Word.toIntX(Word.+(Word.fromInt x, Word.fromInt y))     fun x + y = Word.toIntX(Word.+(Word.fromInt x, Word.fromInt y))
# Line 354  Line 350 
350                        val _       = span := SOME spanMap                        val _       = span := SOME spanMap
351                    in  setSpan end                    in  setSpan end
352                    else fn _ => ()                    else fn _ => ()
353                in  fn (v, v' as NODE{color=ref(PSEUDO | COLORED _), ...}) =>                in
354                    fn (v, v' as NODE{color=ref(PSEUDO | COLORED _), ...}) =>
355                         setSpan(v, liveness(v, v', addEdge))
356                     | (v, v' as NODE{color=ref(MEMREG _), ...}) =>
357                       setSpan(v, liveness(v, v', addEdge))                       setSpan(v, liveness(v, v', addEdge))
                    | (v, v' as NODE{color=ref(SPILLED c), ...}) =>  
                      if c >= 0 then setSpan(v, liveness(v, v', addEdge)) else ()  
358                     | _ => ()                     | _ => ()
359                end                end
360               ) nodes;               ) nodes;
# Line 434  Line 431 
431    
432             val addAffectedBlocks = Intmap.add affectedBlocks             val addAffectedBlocks = Intmap.add affectedBlocks
433    
434             fun ins set =             fun ins set = let
435             let val add  = Intmap.add set                 val add  = Intmap.add set
436                 val look = Intmap.mapWithDefault(set, [])                 val look = Intmap.mapWithDefault(set, [])
437                 fun enter(r, []) = ()                 fun enter(r, []) = ()
438                   | enter(r, pt::pts) =                   | enter(r, pt::pts) =
# Line 449  Line 446 
446             val insSpillSet  = ins spillSet             val insSpillSet  = ins spillSet
447             val insReloadSet = ins reloadSet             val insReloadSet = ins reloadSet
448             val insKillSet   =             val insKillSet   =
449             let val add  = Intmap.add killSet               let
450                   val add  = Intmap.add killSet
451                 val look = Intmap.mapWithDefault(killSet, [])                 val look = Intmap.mapWithDefault(killSet, [])
452                 fun enter(r, []) = ()                 fun enter(r, []) = ()
453                   | enter(r, pt::pts) = (add(pt, r::look pt); enter(r, pts))                   | enter(r, pt::pts) = (add(pt, r::look pt); enter(r, pts))
# Line 457  Line 455 
455             end             end
456    
457             (* Mark all spill/reload locations *)             (* Mark all spill/reload locations *)
458             fun markSpills [] = ()             fun markSpills(G.NODE{color, number, defs, uses, ...}) =
              | markSpills(  
                 G.NODE{color, number, defs as ref d, uses as ref u, ...}::ns) =  
459                 let fun spillIt(defs, uses) =                 let fun spillIt(defs, uses) =
460                         (insSpillSet(number, defs);                         (insSpillSet(number, defs);
461                          insReloadSet(number, uses);                          insReloadSet(number, uses);
# Line 468  Line 464 
464                             [] => insKillSet(number, defs)                             [] => insKillSet(number, defs)
465                           | _ => ()                           | _ => ()
466                         )                         )
467                 in  case !color of                     val d = !defs
468                       G.SPILLED c => spillIt(d, u)                     val u = !uses
469                   in
470                     case !color
471                     of G.SPILLED     => spillIt(d,u)
472                      | G.SPILL_LOC _ => spillIt(d,u)
473                      | G.MEMREG _    => spillIt(d,u)
474                     | G.PSEUDO => spillIt(d, u)                     | G.PSEUDO => spillIt(d, u)
475                     | _ => ();                    | _ => ()
                    markSpills ns  
476                 end                 end
477             val _ = markSpills nodesToSpill             val _ = app markSpills nodesToSpill
478    
479             (* Rewrite all affected blocks *)             (* Rewrite all affected blocks *)
480             fun rewriteAll (blknum, _) =             fun rewriteAll (blknum, _) =
481                 case A.sub(blockTable, blknum) of               (case A.sub(blockTable, blknum)
482                    F.BBLOCK{annotations, insns as ref instrs, ...} =>                of F.BBLOCK{annotations, insns as ref instrs, ...} => let
483                    let val instrs =                      val instrs =
484                            spillRewrite{pt=progPt(blknum, length instrs),                            spillRewrite{pt=progPt(blknum, length instrs),
485                                         instrs=instrs,                                         instrs=instrs,
486                                         annotations=annotations}                                         annotations=annotations}
487                    in  insns := instrs                    in  insns := instrs
488                    end                    end
489                 | _ => error "rewriteAll"                 | _ => error "rewriteAll"
490                 (*esac*))
491    
        in  Intmap.app rewriteAll affectedBlocks;  
            let val spilledMarker = SPILLED ~2  
                fun mark [] = ()  
                  | mark(G.NODE{number, color as ref(SPILLED c), ...}::rest)=  
                      (if number <> c then color := spilledMarker else ();  
                       mark rest)  
                  | mark(G.NODE{color as ref PSEUDO, ...}::rest) =  
                       (color := spilledMarker; mark rest)  
                  | mark(_::rest) = mark rest  
            in  mark nodesToSpill  
            end;  
            rebuild(cellkind, graph)  
        end  
492    
493     in  {build=build, spill=spill,             fun mark(G.NODE{color, ...}) =
494                 (case !color
495                  of PSEUDO => color := SPILLED
496                   | SPILLED => ()
497                   | SPILL_LOC _ => ()
498                   | ALIASED _ => ()
499                   | MEMREG _ => ()
500                   | COLORED _ => error "mark: COLORED"
501                   | REMOVED =>  error "mark: REMOVED"
502                 (*esac*))
503           in
504             Intmap.app rewriteAll affectedBlocks;
505             app mark nodesToSpill;
506             rebuild(cellkind, graph)
507           end (* spill *)
508       in
509         { build       = build,
510           spill       = spill,
511          programPoint=fn{block,instr} => progPt(block,instr),          programPoint=fn{block,instr} => progPt(block,instr),
512          blockNum=blockNum,          blockNum=blockNum,
513          instrNum=instrNum          instrNum=instrNum
514         }         }
515     end     end
   
516  end  end
517    

Legend:
Removed from v.651  
changed lines
  Added in v.705

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