Annotation of researchv10no/cmd/sml/src/cps/reorder.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: structure Reorder : sig val reorder : Lambda.lexp -> Lambda.lexp end = 
        !             3: struct
        !             4: 
        !             5: open Lambda
        !             6: 
        !             7: fun inorder({regs=ra:int,side=sa,exp=_}
        !             8:               :: (rest as {regs=rb,side=sb,exp=_} :: _)) =
        !             9:     (ra >= rb orelse sa andalso sb) andalso inorder rest
        !            10:   | inorder _ = true
        !            11: 
        !            12: fun cost(r::rest) = max(r, 1+cost rest)
        !            13:   | cost nil = 0
        !            14: 
        !            15: fun insert(a as{side=true,...}, l as {side=true,...}::_) = a::l
        !            16:   | insert(a as{regs=ra,side,exp,var}, l as (b as {regs=rb,...})::c) =
        !            17:        if (ra:int) >= rb then a::l else b::insert(a,c)
        !            18:   | insert(a,l) = a::l
        !            19: 
        !            20: fun sort(do_it, l) = if inorder l 
        !            21:      then {regs=cost(map (#regs) l), side=exists (#side) l, 
        !            22:           exp= do_it(map (#exp) l)}
        !            23:      else let val l' = map (fn{regs,side,exp}=>
        !            24:                              {regs=regs,side=side,exp=exp,
        !            25:                                        var=Access.mkLvar()})
        !            26:                           l
        !            27:               val e0 = do_it (map (fn {var,...}=> VAR var) l')
        !            28:               val l'' = fold insert l' nil
        !            29:           in {regs= cost(map (#regs) l''),
        !            30:               side = exists (#side) l'',
        !            31:               exp = fold (fn({var,exp,...},e)=>APP(FN(var,e),exp)) l'' e0}
        !            32:          end
        !            33: 
        !            34: val many = 12   (* how many regs to charge a function call *)
        !            35: 
        !            36: val rec reorder : lexp -> {regs: int, side: bool, exp: lexp} =
        !            37:   fn e as VAR _ => {regs=0, side=false, exp=e}
        !            38:    | FN(v,e) => {regs=1, side=false, exp= FN(v, #exp(reorder e))}
        !            39:    | FIX(vl,el,e) => let val {regs,side,exp} = reorder e 
        !            40:                       in {regs=regs+1,side=side,exp=FIX(vl,el,exp)}
        !            41:                      end
        !            42:    | APP(PRIM i, b) => let val {regs=r,side=s,exp=e1} = reorder b
        !            43:                           val e2 = APP(PRIM i, e1)
        !            44:                        in if Prim.pure i then {regs=r,side=s,exp=e2}
        !            45:                                          else {regs=many,side=true,exp=e2}
        !            46:                       end
        !            47:    | e as APP(a,b) => let val {regs=r,side=s,exp=e1} = 
        !            48:                            sort( fn[x,y]=>APP(x,y), map reorder [a,b])
        !            49:                       in {regs=many,side=true,exp=e1}
        !            50:                      end
        !            51:    | e as INT i => {regs=0, side=false, exp=e}
        !            52:    | e as REAL i => {regs=0, side=false, exp=e}
        !            53:    | e as STRING i => {regs=0, side=false, exp=e}
        !            54:    | SWITCH(e0,l,d) => 
        !            55:          let val {regs,side,exp}= reorder e0
        !            56:              val (lr,ls,l') = fold (fn((c,e),(r,s,l)) =>
        !            57:                                    let val {regs,side,exp}=reorder e
        !            58:                                      in (max(r,regs),s orelse side,(c,exp)::l)
        !            59:                                     end) l (regs,side,nil)
        !            60:           in case d 
        !            61:               of SOME d' => let val {regs=dr,side=ds,exp=de} = reorder d'
        !            62:                             in {regs=max(lr,dr),side=ls orelse ds,
        !            63:                                 exp=SWITCH(exp,l',SOME de)}
        !            64:                            end               
        !            65:                | NONE => {regs=lr,side=ls,exp=SWITCH(exp,l',NONE)}
        !            66:           end
        !            67:    | RECORD l => sort(RECORD, map reorder l)
        !            68:    | SELECT(i,e) => let val {regs,side,exp} = reorder e
        !            69:                      in {regs=max(1,regs),side=side,exp=SELECT(i,exp)}
        !            70:                     end
        !            71:    | RAISE e =>     let val {regs,side,exp} = reorder e
        !            72:                      in {regs=max(1,regs),side=side,exp=RAISE exp}
        !            73:                     end
        !            74:    | HANDLE(a,b) => let val {regs=ra,side=sa,exp=ea} = reorder a
        !            75:                         val {regs=rb,side=sb,exp=eb} = reorder b
        !            76:                      in {regs=ra,side=sa orelse sb,exp=HANDLE(ea,eb)}
        !            77:                     end
        !            78:    | e as PRIM i => {regs=0,side=false,exp=e}
        !            79: 
        !            80: val reorder = fn x => #exp (reorder x)
        !            81: 
        !            82: end

unix.superglobalmegacorp.com

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