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/compiler/FLINT/cpsopt/contract.sml
ViewVC logotype

Diff of /sml/trunk/compiler/FLINT/cpsopt/contract.sml

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

revision 4666, Tue Jun 12 18:46:20 2018 UTC revision 4667, Tue Jun 12 18:46:48 2018 UTC
# Line 993  Line 993 
993         RCC (k, l, p, map ren vl, wtl, g' e)         RCC (k, l, p, map ren vl, wtl, g' e)
994     | BRANCH(i,vl,c,e1,e2) =>     | BRANCH(i,vl,c,e1,e2) =>
995        let val vl' = map ren vl        let val vl' = map ren vl
   
           (* Maximum number of speculatively executed conditional moves *)  
           val MAX_CONDMOVE_HOIST = 3  
   
           (* This function creates conditional move from  
            * branches of the form:  
            *    BRANCH(i,vl,c,APP(f,[x1]),APP(f,[x2]))  
            *)  
           fun conditionalMove() =  
               let (* Hoist conditional moves up from branches  
                    * This will make them speculatively.  
                    * We limit this number to MAX_CONDMOVE_HOIST, so  
                    * that we don't speculatively execute everything.  
                    *)  
                   fun hoist(e, 0) = (fn k => k, e)  
                     | hoist(PURE(p as P.condmove _,vl,x,t,e), n) =  
                       let val (k, e) = hoist(e, n-1)  
                           fun newK e = PURE(p,vl,x,t,k e)  
                       in  (newK, e)  
                       end  
                     | hoist(e, _) = (fn k => k, e)  
                   val (k1, e1) = hoist(g' e1, MAX_CONDMOVE_HOIST)  
                   val (k2, e2) = hoist(g' e2, MAX_CONDMOVE_HOIST)  
   
                       (* The default does nothing *)  
                   fun default() = BRANCH(i, vl', c, k1 e1, k2 e2)  
   
                       (* detemine the type of conditional move *)  
                   fun findType(f,x,y) = let  
                       fun getTy (x, again) = (case x  
                            of STRING _ => SOME BOGt  
                             | LABEL _ => SOME BOGt  
                             | REAL _ => SOME(FLTt 64) (* REAL32: FIXME *)  
 (* QUESION: why is this restricted to boxed integers? *)  
                             | NUM{ty={sz=32, ...}, ...} => SOME(boxIntTy 32) (* 64BIT: FIXME *)  
                             | NUM{ty={tag=true, ...}, ...} => SOME BOGt  
                             | _ => again()  
                           (* end case *))  
                       fun findTy() = getTy(x, fn _ => getTy(y, fn _ => NONE))  
                       in  case #info(get f) of  
                              FNinfo{args=[f_arg], ...} =>  
                              (case #info(get f_arg) of  
                                 MISCinfo t => SOME t (* found type *)  
                              | _ => findTy()  
                              )  
                            |  _ => findTy()  
                       end  
   
               in  case (i, e1, e2) of  
                     (* String compares are complex, so we punt on them *)  
                     ((P.streq | P.strneq), _, _) => default()  
                   | (_, APP(VAR f, [x]), APP(VAR f', [y])) =>  
                       if f = f' then  
                       (case findType(f,x,y) of  
                            SOME t =>  
                            let val r = LV.mkLvar()  
                            in  say "COND MOVE\n";  
                                k1(k2(  
                                   PURE(P.condmove i,vl' @ [x,y],  
                                        r,t,APP(VAR f,[VAR r]))))  
                            end  
                       | _ => (say "COND MOVE failed\n"; default())  
                       )  
                       else default()  
                   | _ => default()  
               end  
   
           fun noConditionalMove() = BRANCH(i, vl', c, g' e1, g' e2)  
   
996            fun h() = (if !CG.branchfold andalso equalUptoAlpha(e1,e2)            fun h() = (if !CG.branchfold andalso equalUptoAlpha(e1,e2)
997                       then (click "z";                       then (click "z";
998                             app use_less vl';                             app use_less vl';
# Line 1079  Line 1010 
1010                                       drop_body e1;                                       drop_body e1;
1011                                       g' e2)                                       g' e2)
1012                       else raise ConstFold)                       else raise ConstFold)
1013                   handle ConstFold => noConditionalMove()                   handle ConstFold => BRANCH(i, vl', c, g' e1, g' e2)
1014            fun getifidiom f =            fun getifidiom f =
1015              let val f' = ren f              let val f' = ren f
1016              in  case f'              in  case f'

Legend:
Removed from v.4666  
changed lines
  Added in v.4667

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