comparison src/mono_reduce.sml @ 1824:216e92b39fc1

Paranoid inlining prevention for FFI types at the Core level; less paranoid inlining promotion for passive values at the Mono level
author Adam Chlipala <adam@chlipala.net>
date Wed, 19 Sep 2012 18:01:22 -0400
parents 3c56aa6a0f55
children c1e3805e604e
comparison
equal deleted inserted replaced
1823:66a58d8501e0 1824:216e92b39fc1
535 let 535 let
536 (*val () = Print.prefaces "exp" [("e", MonoPrint.p_exp env (e, ErrorMsg.dummySpan))]*) 536 (*val () = Print.prefaces "exp" [("e", MonoPrint.p_exp env (e, ErrorMsg.dummySpan))]*)
537 537
538 fun doLet (x, t, e', b) = 538 fun doLet (x, t, e', b) =
539 let 539 let
540 val notValue = U.Exp.exists {typ = fn _ => false, 540 fun passive (e : exp) =
541 exp = fn e => 541 case #1 e of
542 case e of 542 EPrim _ => true
543 EPrim _ => false 543 | ERel _ => true
544 | ECon _ => false 544 | ENamed _ => true
545 | ENone _ => false 545 | ECon (_, _, NONE) => true
546 | ESome _ => false 546 | ECon (_, _, SOME e) => passive e
547 | ERecord _ => false 547 | ENone _ => true
548 | _ => true} 548 | ESome (_, e) => passive e
549 549 | EFfi _ => true
550 | EAbs _ => true
551 | ERecord xets => List.all (passive o #2) xets
552 | EField (e, _) => passive e
553 | _ => false
550 554
551 fun doSub () = 555 fun doSub () =
552 let 556 let
553 val r = subExpInExp (0, e') b 557 val r = subExpInExp (0, e') b
554 in 558 in
624 andalso not (freeInAbs b) then 628 andalso not (freeInAbs b) then
625 trySub () 629 trySub ()
626 else 630 else
627 e 631 e
628 end 632 end
629 else if countFree 0 0 b > 1 andalso notValue e' then 633 else if countFree 0 0 b > 1 andalso not (passive e') then
630 e 634 e
631 else 635 else
632 trySub () 636 trySub ()
633 end 637 end
634 638