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 /MLRISC/trunk/IR/mlrisc-cfg2cluster.sml
ViewVC logotype

Diff of /MLRISC/trunk/IR/mlrisc-cfg2cluster.sml

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

revision 411, Fri Sep 3 00:25:03 1999 UTC revision 429, Wed Sep 8 09:47:00 1999 UTC
# Line 41  Line 41 
41    
42      fun error msg = MLRiscErrorMsg.error("CFG2Cluster",msg)      fun error msg = MLRiscErrorMsg.error("CFG2Cluster",msg)
43    
44        val dummyNode = F.LABEL(Label.Label{id= ~1, addr=ref ~1, name=""})
45    
46      fun pseudo_op (CFG.LABEL l) = F.LABEL l      fun pseudo_op (CFG.LABEL l) = F.LABEL l
47        | pseudo_op (CFG.PSEUDO p) = F.PSEUDO p        | pseudo_op (CFG.PSEUDO p) = F.PSEUDO p
48    
# Line 104  Line 106 
106        | id_of(F.ENTRY{blknum,...})  = blknum        | id_of(F.ENTRY{blknum,...})  = blknum
107        | id_of(F.EXIT{blknum,...})   = blknum        | id_of(F.EXIT{blknum,...})   = blknum
108    
109      fun delete_preentries (ENTRY,G.GRAPH cfg) =      fun delete_preentries (ENTRY,CFG as G.GRAPH cfg) =
110      let val CFG.INFO{regmap=ref regmap,...} = #graph_info cfg      let val CFG.INFO{regmap,...} = #graph_info cfg
111          fun remove (ENTRY,i,_) =          fun remove (ENTRY,i,_) =
112              let val block as CFG.BLOCK{kind,insns,...} = #node_info cfg i          let val block as CFG.BLOCK{labels,kind,insns,...} = #node_info cfg i
113              in  if kind = CFG.FUNCTION_ENTRY then              in  if kind = CFG.FUNCTION_ENTRY then
114                     let val out_edges = #out_edges cfg i              let val [(i,j,e)] = #out_edges cfg i
115                         val out_edges' = map (fn (i,j,e)=>(ENTRY,j,e)) out_edges                  val CFG.BLOCK{labels=l,...} = #node_info cfg j
116                     in  case !insns of                     in  case !insns of
117                            [] => ()                            [] => ()
118                         |  _  => (print (CFG.show_block regmap block);                  |  _  => (print (CFG.show_block [] regmap block);
119                                   error "delete_preentries");                                   error "delete_preentries");
120                         app (#add_edge cfg) out_edges';                  #add_edge cfg (ENTRY,j,e);
121                    l := !labels @ !l;
122                         #remove_node cfg i                         #remove_node cfg i
123                     end                     end
124                  else ()                  else ()
# Line 143  Line 146 
146          val CFG.INFO{regmap,annotations,...} = #graph_info cfg          val CFG.INFO{regmap,annotations,...} = #graph_info cfg
147          val _       = delete_preentries(ENTRY,CFG)          val _       = delete_preentries(ENTRY,CFG)
148          val _       = remove_entry_to_exit(ENTRY,EXIT,CFG)          val _       = remove_entry_to_exit(ENTRY,EXIT,CFG)
149          val A       = A.array(M,F.LABEL(Label.newLabel ""))          val A       = A.array(M,dummyNode)
150          val nodes   = List.filter(fn (i,CFG.BLOCK{kind,...}) =>          val nodes   = List.filter(fn (i,CFG.BLOCK{kind,...}) =>
151                             i <> ENTRY andalso i <> EXIT andalso                             i <> ENTRY andalso i <> EXIT andalso
152                             kind <> CFG.FUNCTION_ENTRY)                             kind <> CFG.FUNCTION_ENTRY)
# Line 163  Line 166 
166            | set_links _ = ()            | set_links _ = ()
167          val _ = A.app set_links A          val _ = A.app set_links A
168      in  F.CLUSTER{ blkCounter  = ref M,      in  F.CLUSTER{ blkCounter  = ref M,
169                     regmap      = !regmap,                     regmap      = regmap,
170                     blocks      = blocks,                     blocks      = blocks,
171                     entry       = entry,                     entry       = entry,
172                     exit        = exit,                     exit        = exit,
# Line 183  Line 186 
186                          [EXIT] => EXIT                          [EXIT] => EXIT
187                        | _ => raise Graph.NotSingleExit                        | _ => raise Graph.NotSingleExit
188          val _        = delete_preentries(ENTRY,CFG)          val _        = delete_preentries(ENTRY,CFG)
189          val CFG.INFO{firstBlock,regmap=ref regmap,annotations,...} =          val CFG.INFO{firstBlock,regmap=regmap,annotations,...} =
190                 #graph_info cfg                 #graph_info cfg
191          val A        = A.array(M,F.LABEL(Label.newLabel "")) (* new id -> F.block *)          val A        = A.array(M,dummyNode)    (* new id -> F.block *)
192          val A'       = A.array(M,~1)           (* new id -> old id *)          val A'       = A.array(M,~1)           (* new id -> old id *)
193          val A''      = A.array(M,~1)           (* old id -> new id *)          val A''      = A.array(M,~1)           (* old id -> new id *)
194          val min_pred = A.array(M,10000000)          val min_pred = A.array(M,10000000)
# Line 268  Line 271 
271          fun preds i = map (fn (i,_,CFG.EDGE{w,...}) =>          fun preds i = map (fn (i,_,CFG.EDGE{w,...}) =>
272                                 (A.sub(A,A.sub(A'',i)),w))                                 (A.sub(A,A.sub(A'',i)),w))
273                                   (#in_edges cfg (A.sub(A',i)))                                   (#in_edges cfg (A.sub(A',i)))
         local  
             val look = Intmap.map regmap  
         in  fun reglookup r = look r handle _ => r  
         end  
   
274          fun set_links(F.BBLOCK{blknum,pred,succ,insns,...}) =          fun set_links(F.BBLOCK{blknum,pred,succ,insns,...}) =
275              let fun isBackwardBranch((F.BBLOCK{blknum=next,...},_)::bs) =              let fun isBackwardBranch((F.BBLOCK{blknum=next,...},_)::bs) =
276                        next <= blknum orelse isBackwardBranch bs                        next <= blknum orelse isBackwardBranch bs

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

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