Mercurial > urweb
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 |