Annotation of researchv10no/cmd/sml/src/cps/cpscomp.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: functor CPScomp(CM : CMACHINE) : 
                      3:                sig val compile : Lambda.lexp -> unit end =
                      4: struct
                      5: 
                      6: structure CPSg = CPSgen(CM)
                      7: structure CPSopt = CPSopt(val maxfree = 3+length(CM.miscregs))
                      8: structure Closure = Closure(val maxfree = 3+length(CM.miscregs))
                      9: structure Spill = Spill(val maxfree = 3+length(CM.miscregs))
                     10: 
                     11: open ErrorMsg Access Basics BareAbsyn ProcessFile
                     12: 
                     13:  val write = CM.comment
                     14: 
                     15:  fun time (f,m,s) x =
                     16:         let val _ = debugmsg m
                     17:            val t = System.Timer.start_timer()
                     18:             val r = f x
                     19:            val t' = System.Timer.check_timer t
                     20:             val _ = (write "After "; write m; write ":\n")
                     21:         in  System.Stats.update(s,t');
                     22:            timemsg(m ^ ": " ^ System.Timer.makestring t' ^ "s");
                     23:            flush_out(std_out);
                     24:            r
                     25:         end
                     26: 
                     27: fun compile lexp =
                     28:  let
                     29:   val reorder = time(Reorder.reorder,"reorder",System.Stats.codeopt)
                     30:   val lexp = reorder lexp
                     31: 
                     32:   val convert   = time(Convert.convert,"convert",System.Stats.convert)
                     33:   val (function, ctable) = convert lexp
                     34:   fun fprint (function as (f,vl,cps)) =
                     35:          (if !System.Control.CG.printit
                     36:                then CPSprint.show write (Intmap.map ctable)
                     37:                                (CPS.FIX([function],CPS.PRIMOP(P.+,[],[],[])))
                     38:                else ();
                     39:           if !System.Control.CG.printsize then CPSsize.printsize cps else ())
                     40:   val _ = fprint function;
                     41: 
                     42:   val cpsopt = time(CPSopt.reduce ctable,"cpsopt",System.Stats.cpsopt)
                     43:   val function = let val (f,vl,cps) = function in (f,vl, cpsopt cps) end
                     44:   fun newconst c = let val v = mkLvar()
                     45:                    in  Intmap.add ctable (v,CPS.INTconst c); v
                     46:                   end
                     47:   fun prof(a,b,ce) = CPS.PRIMOP(P.profile, [newconst a,newconst b],nil,[ce])
                     48:   val ctable = Intmap.map ctable
                     49:   val constant = fn w => ((ctable w; true) handle Ctable => false)
                     50:   val _ = fprint function
                     51: 
                     52:   val closure   = time(Closure.closeCPS,"closure",System.Stats.closure)
                     53:   val (function,known,unknown) = closure(function,constant,prof)
                     54:   val constant = fn w => constant w orelse known w orelse unknown w
                     55:   val _ = fprint function
                     56: 
                     57:   val globalfix = time(GlobalFix.globalfix,"globalfix",System.Stats.globalfix)
                     58:   val carg = globalfix(function,known)
                     59:   val _ = app fprint (map #1 carg)
                     60: 
                     61:   val spill     = time(Spill.spill,"spill",System.Stats.spill)
                     62:   val constant' = let val s = Intset.new()
                     63:                      val _ = app (Intset.add s o #1 o #1) carg
                     64:                      val isfun = Intset.mem s
                     65:                   in fn v => constant v orelse isfun v
                     66:                  end
                     67:   val carg = spill(carg,constant',prof)
                     68:   val _ = (app fprint (map #1 carg); write "\n")
                     69: 
                     70:   val codegen   = time(CPSg.codegen,"codegen",System.Stats.codegen)
                     71:   val _ = codegen(carg,ctable,constant')
                     72:   val _ = debugmsg "done"
                     73:   in ()
                     74:  end
                     75: end (* functor CPScomp *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.