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

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

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

revision 113, Fri Jun 5 19:41:21 1998 UTC revision 127, Mon Sep 7 19:06:29 1998 UTC
# Line 9  Line 9 
9  functor RegAllocator  functor RegAllocator
10    (structure RaArch : RA_ARCH_PARAMS)    (structure RaArch : RA_ARCH_PARAMS)
11    (structure RaUser : RA_USER_PARAMS    (structure RaUser : RA_USER_PARAMS
 (*    where I = RaArch.I -- bug 1205 *)  
12      where type I.operand = RaArch.I.operand      where type I.operand = RaArch.I.operand
13        and type I.instruction = RaArch.I.instruction        and type I.instruction = RaArch.I.instruction
14       (* -- equivalent where type if where structure not working *)          and type B.name = RaArch.Liveness.F.B.name) : RA =
   ) : RA =  
15  struct  struct
16    structure F = RaArch.Liveness.F    structure F = RaArch.Liveness.F
17    structure P = RaArch.InsnProps    structure P = RaArch.InsnProps
# Line 838  Line 836 
836                    SL.uniq(Intmap.map uInfo n) handle _ => [])                    SL.uniq(Intmap.map uInfo n) handle _ => [])
837        end        end
838    
       fun allBlocksAffected () = let  
         fun merge([], L) = L  
           | merge(x::xs, L) = merge(xs, SL.enter(x, L))  
       in List.foldl merge [] (map affectedBlocks spillList)  
       end  
   
839        (* Insert spill code into the affected blocks *)        (* Insert spill code into the affected blocks *)
840        fun doBlocks([], _, prevSpills) = prevSpills        fun doBlocks([], _, prevSpills) = prevSpills
841          | doBlocks(blknum::rest, node, pSpills) = let          | doBlocks(blknum::rest, node, pSpills) = let
842              fun mapr r = Intmap.map regmap r handle _ => r              fun mapr r = Intmap.map regmap r handle _ => r
843              val F.BBLOCK{insns, liveOut, ...} = Array.sub(cblocks, blknum)              val F.BBLOCK{insns, liveOut, name, ...} = Array.sub(cblocks, blknum)
844              val bdu = Array.sub(blockDU, blknum)              val bdu = Array.sub(blockDU, blknum)
845              val liveOut = chaseRegs (rmvDedicated(RaArch.regSet(!liveOut)))              val liveOut = chaseRegs (rmvDedicated(RaArch.regSet(!liveOut)))
846    
# Line 877  Line 869 
869    
870                    (* insert reloading code and continue *)                    (* insert reloading code and continue *)
871                    fun reloadInstr(instr, du, newI, newBDU, prevSpills) = let                    fun reloadInstr(instr, du, newI, newBDU, prevSpills) = let
872                      val {code, proh} = RaUser.reload{regmap=mapr, instr=instr, reg=spillReg}                      val {code, proh} =
873                          RaUser.reload{regmap=mapr, instr=instr, reg=spillReg, id=name}
874                      val prevSpills = mergeProh(proh, prevSpills)                      val prevSpills = mergeProh(proh, prevSpills)
875                      val {newI, newBDU} = outputInstrs(code, newI, newBDU)                      val {newI, newBDU} = outputInstrs(code, newI, newBDU)
876                    in doInstrs(rest, bDU, newI, newBDU, prevSpills)                    in doInstrs(rest, bDU, newI, newBDU, prevSpills)
# Line 893  Line 886 
886                             val cpyInstr = RaUser.copyInstr(cpy, instr)                             val cpyInstr = RaUser.copyInstr(cpy, instr)
887                             val duCpy = defUse cpyInstr                             val duCpy = defUse cpyInstr
888                             val {code, proh} =                             val {code, proh} =
889                               RaUser.reload{regmap=mapr, instr=RaUser.copyInstr(mv, instr), reg=spillReg}                               RaUser.reload{regmap=mapr, instr=RaUser.copyInstr(mv, instr),
890                                               reg=spillReg, id=name}
891                             val prevSpills = mergeProh(proh, prevSpills)                             val prevSpills = mergeProh(proh, prevSpills)
892                             val {newI, newBDU} = outputInstrs(code, newI, newBDU)                             val {newI, newBDU} = outputInstrs(code, newI, newBDU)
893                           in                           in
# Line 910  Line 904 
904                      if P.moveInstr(instr) then                      if P.moveInstr(instr) then
905                        reloadCopy(du, instr, newI, newBDU, prevSpills)                        reloadCopy(du, instr, newI, newBDU, prevSpills)
906                      else if nodeMember(node, u) then let                      else if nodeMember(node, u) then let
907                          val {code, proh} = RaUser.reload{regmap=mapr, instr=instr, reg=spillReg}                          val {code, proh} =
908                              RaUser.reload{regmap=mapr, instr=instr, reg=spillReg, id=name}
909                          val {newI, newBDU} = outputInstrs(code, newI, newBDU)                          val {newI, newBDU} = outputInstrs(code, newI, newBDU)
910                          val prevSpills = mergeProh(proh, prevSpills)                          val prevSpills = mergeProh(proh, prevSpills)
911                        in doInstrs(rest, bDU, newI, newBDU, prevSpills)                        in doInstrs(rest, bDU, newI, newBDU, prevSpills)
# Line 920  Line 915 
915    
916    
917                    fun spillInstr(instr, newI, newBDU, prevSpills) = let                    fun spillInstr(instr, newI, newBDU, prevSpills) = let
918                      val {code, instr, proh} = RaUser.spill{regmap=mapr,  instr=instr, reg=spillReg}                      val {code, instr, proh} =
919                          RaUser.spill{regmap=mapr,  instr=instr, reg=spillReg, id=name}
920                      val prevSpills = mergeProh(proh, prevSpills)                      val prevSpills = mergeProh(proh, prevSpills)
921                      val {newI, newBDU} = outputInstrs(code, newI, newBDU)                      val {newI, newBDU} = outputInstrs(code, newI, newBDU)
922                    in                    in
# Line 986  Line 982 
982                         of P.IK_JUMP =>                         of P.IK_JUMP =>
983                             if escapes(P.branchTargets instr) then let                             if escapes(P.branchTargets instr) then let
984                                 val {code,...} =                                 val {code,...} =
985                                   RaUser.reload{regmap=mapr, instr=instr, reg=spillReg}                                   RaUser.reload{regmap=mapr, instr=instr, reg=spillReg, id=name}
986                                 val reloadDU = map defUse code                                 val reloadDU = map defUse code
987                               in (rev code@rest, rev reloadDU@bdu)                               in (rev code@rest, rev reloadDU@bdu)
988                               end                               end
# Line 1185  Line 1181 
1181        end        end
1182  end (* functor *)  end (* functor *)
1183    
 (*  
  * $Log$  
  *)  
1184    

Legend:
Removed from v.113  
changed lines
  Added in v.127

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