~ chicken-core (chicken-5) a5006d93b6697e4e38722376d87724c99ec251f8
commit a5006d93b6697e4e38722376d87724c99ec251f8 Author: Peter Bex <peter@more-magic.net> AuthorDate: Sun Feb 28 18:15:37 2016 +0100 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Sun Feb 28 18:15:37 2016 +0100 Fix excessive temporary generation In deeply nested if structures, we would generate a set of temporaries for each arm of the if, while the code would re-use temporaries. This means if each arm uses N temporaries, at a nesting depth of M we would generate N*2^M temporaries, instead of just N. This is especially clear in the generated code for core.scm; there is one C function with over 200 temporaries which uses less than 100! Signed-off-by: Evan Hanson <evhan@foldling.org> diff --git a/core.scm b/core.scm index 76419b43..77f306c8 100644 --- a/core.scm +++ b/core.scm @@ -2863,11 +2863,14 @@ ((if ##core#cond) (let* ((test (walk (first subs) e e-count here boxes)) + (t0 temporaries) (a0 allocated) (x1 (walk (second subs) e e-count here boxes)) + (t1 temporaries) (a1 allocated) (x2 (walk (third subs) e e-count here boxes))) (set! allocated (+ a0 (max (- allocated a1) (- a1 a0)))) + (set! temporaries (+ t0 (max (- temporaries t1) (- t1 t0)))) (make-node class params (list test x1 x2)))) ((##core#switch)Trap