From 5782eb24f96d01fba6d2a98a6b6e9dff04042bd7 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 20 Mar 2018 20:35:40 -0700 Subject: compiler: improve progn. * share/txr/stdlib/compiler.tl (compiler comp-progn): If the suggested output register is a variable, progn should not use it for the discarded values of the leading forms, only for the last form. Writes to the variable space of the display are costly because in closures, the underlying vector of a given level has to be passed to gc_mutated. We use a new temp register for the discarded forms. --- share/txr/stdlib/compiler.tl | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'share') diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index c63e1300..c65acb56 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -442,14 +442,23 @@ (defmeth compiler comp-progn (me oreg env args) (let* (ffuns fvars + (nargs (len args)) lastfrag + (oreg-discard (if (eq (car oreg) t) + oreg + me.(alloc-treg))) (code (build - (each ((form args)) - (let ((frag me.(compile oreg env form))) - (set lastfrag frag) - (set fvars (uni fvars frag.fvars)) - (set ffuns (uni ffuns frag.ffuns)) - (pend frag.code)))))) + (each ((form args) + (n (range 1))) + (let ((islast (eql n nargs))) + (let ((frag me.(compile (if islast oreg oreg-discard) + env form))) + (when islast + (set lastfrag frag)) + (set fvars (uni fvars frag.fvars)) + (set ffuns (uni ffuns frag.ffuns)) + (pend frag.code))))))) + me.(free-treg oreg-discard) (new (frag (if lastfrag lastfrag.oreg ^(t 0)) code fvars ffuns)))) (defmeth compiler comp-prog1 (me oreg env form) -- cgit v1.2.3