[gambit-list] Need to reverse order of constant propagation and specialization

Bradley Lucier lucier at math.purdue.edu
Sun Jun 26 01:03:31 EDT 2005


Marc:

Consider the following code:

(declare (standard-bindings)(extended-bindings)(block))

(define (expt1 a b)
   (define (square x) (* x x))
   (cond ((= b 0) 1)
         ((even? b)
          (square (expt1 a (quotient b 2))))
         (else
          (* a (square (expt1 a (quotient b 2)))))))

(declare (inlining-limit 100000))

(define a (expt1 2 20))

(define b (expt1 2 40))

(define c (expt1 2 80))

When compiled, this gives

peano-71% gsc -c -expansion crap
loading /pkgs/Gambit-C/gambcext.scm
Expansion:

(define expt1
   (lambda (a b)
     (if (if (and (##fixnum? b) #t) (##fixnum.= b 0) (= b 0))
         1
         (if (even? b)
             (let ((x (expt1 a
                             (or (and (##fixnum? b) (##fixnum.quotient? 
b 2))
                                 (quotient b 2)))))
               (or (and (##fixnum? x) (and (##fixnum? x) (##fixnum.*? x 
x)))
                   (* x x)))
             (let ((temp (let ((x (expt1 a
                                         (or (and (##fixnum? b)
                                                  (##fixnum.quotient? b 
2))
                                             (quotient b 2)))))
                           (or (and (##fixnum? x)
                                    (and (##fixnum? x) (##fixnum.*? x 
x)))
                               (* x x)))))
               (or (and (##fixnum? a)
                        (and (##fixnum? temp) (##fixnum.*? a temp)))
                   (* a temp)))))))

(define a 1048576)

(define b (or (##fixnum.*? 1048576 1048576) 1099511627776))

(define c
   (let ((x (or (##fixnum.*? 1048576 1048576) 1099511627776)))
     (or (and (##fixnum? x) (and (##fixnum? x) (##fixnum.*? x x))) (* x 
x))))


Note how a is completely determined, b has the code it has because 
(##fixnum.*? 1048576 1048576) could be #t or #f depending on whether 
Gambit was compiled for 32-bit or 64-bit machines, etc.  It seems that 
the expansion of *, +, etc., was done before the constant propagation 
and evaluation of known functions.  This should be reversed, and a, b, 
and c should all be reduced to constants in the compile.

Brad




More information about the Gambit-list mailing list