On Nov 4, 2015, at 10:26 PM, Marc Feeley feeley@iro.umontreal.ca wrote:
As far as I can tell, all of those optimizations are currently done by the Gambit compiler except for loop-invariant code motion and loop inversion. I’m not sure how much those optimizations are useful however.
Marc
OK.
What about this example:
[Media-Mac-mini-3:~] lucier% cat crap.scm (define (a x y) (map + x y))
[Media-Mac-mini-3:~] lucier% gsc -c -expansion crap Expansion:
(define a (lambda (x y) (let ((temp.0 +)) (if (and ('#<procedure #2 ##eq?> map '#<procedure #3 map>) ('#<procedure #4 ##procedure?> temp.0)) (letrec ((loop1.3 (lambda (x y temp.0 temp.4 temp.5) (if (and ('#<procedure #5 ##pair?> temp.4) ('#<procedure #5 ##pair?> temp.5)) (loop1.3 x y temp.0 ('#<procedure #6 ##cdr> temp.4) ('#<procedure #6 ##cdr> temp.5)) (if (and ('#<procedure #7 ##null?> temp.4) ('#<procedure #7 ##null?> temp.5)) (letrec ((loop2.6 (lambda (temp.0 temp.7 temp.8) (if (and ('#<procedure #5 ##pair?> temp.7) ('#<procedure #5 ##pair?> temp.8)) (let ((x.9 (temp.0 ('#<procedure #8 ##car> temp.7) ('#<procedure #8 ##car> temp.8)))) ('#<procedure #9 ##cons> x.9 (loop2.6 temp.0 ('#<procedure #6 ##cdr> temp.7) ('#<procedure #6 ##cdr> temp.8)))) '())))) (loop2.6 temp.0 x y)) (map temp.0 x y)))))) (loop1.3 x y temp.0 x y)) (map temp.0 x y)))))
The gambit compiler doesn’t specialize +.
Or even
[Media-Mac-mini-3:~] lucier% cat crap.scm (define (a x y) (map f64+ x y)) [Media-Mac-mini-3:~] lucier% gsc -c -expansion crap Expansion:
(define a (lambda (x y) (let ((temp.0 f64+)) (if (and ('#<procedure #2 ##eq?> map '#<procedure #3 map>) ('#<procedure #4 ##procedure?> temp.0)) (letrec ((loop1.3 (lambda (x y temp.0 temp.4 temp.5) (if (and ('#<procedure #5 ##pair?> temp.4) ('#<procedure #5 ##pair?> temp.5)) (loop1.3 x y temp.0 ('#<procedure #6 ##cdr> temp.4) ('#<procedure #6 ##cdr> temp.5)) (if (and ('#<procedure #7 ##null?> temp.4) ('#<procedure #7 ##null?> temp.5)) (letrec ((loop2.6 (lambda (temp.0 temp.7 temp.8) (if (and ('#<procedure #5 ##pair?> temp.7) ('#<procedure #5 ##pair?> temp.8)) (let ((x.9 (temp.0 ('#<procedure #8 ##car> temp.7) ('#<procedure #8 ##car> temp.8)))) ('#<procedure #9 ##cons> x.9 (loop2.6 temp.0 ('#<procedure #6 ##cdr> temp.7) ('#<procedure #6 ##cdr> temp.8)))) '())))) (loop2.6 temp.0 x y)) (map temp.0 x y)))))) (loop1.3 x y temp.0 x y)) (map temp.0 x y)))))