[gambit-list] full program optimization

Marc Feeley feeley at iro.umontreal.ca
Sat Mar 3 21:14:20 EST 2018


Currently in Gambit there are two ways to achieve whole program optimization.

The first is to conceptually concatenate all modules by using a file that contains “include”s of all the modules.  This has the advantage of exposing all definitions to the inliner, and to allow the tree-shaker to eliminate the useless code.  This obviously gives a relatively slow compilation, but the best code specialization because the compiler “sees the whole code base”.

The second method is to use the “core” declaration (which is undocumented).  When a toplevel definition is in the scope of a (not core) declaration, it will not generate any code per-se, but the definition is remembered so that the definition can be inlined in the rest of the program.  For example:


% cat mod.scm
;; File: mod.scm

(define (twice x)
  (declare (standard-bindings) (fixnum) (not safe))
  (+ x x))

(define (cube y)
  (declare (standard-bindings) (fixnum) (not safe))
  (* y y y))

% cat prog.scm
;; File: prog.scm

(declare (block) (not core))
(include "mod.scm")
(declare (core))

(println (cube (twice (read))))

% gsc -c -expansion prog.scm
Expansion:

(println (let ((y (let ((x (read)))
                    ('#<procedure #2 ##fx+> x x))))
           ('#<procedure #3 ##fx*> y y y)))


Marc




More information about the Gambit-list mailing list