Marc:
It would help a lot of the inliner knew more about the ##fixnum.blah? operators, e.g., that
(##fixnum.+? x 0) == (##fixnum.+? 0 x) == x (##fixnum.-? x 0) == x (##fixnum.*? x 1) == (##fixnum.*? 1 x) == x (##fixnum.*? x 0) == (##fixnum.*? 0 x) == 0 (##fixnum.quotient x 1) == x (##fixnum.remainder x 1) == 0 (##fixnum.modulo x 1) == 0
I'm including example code and the expansion at the end of this e-mail.
I'm thinking more and more that OPTIMIZE_SPACE should be defined by default in the .c file if any of the mostly-* declarations are in effect; there are just too many damn function calls generated with these options. Or maybe that it should just be defined by default unless a -optimize-space option is passed to gsc.
Brad
[lindv2:Arrays/srfi3/gsc-test] lucier% cat test.scm (define (a x) (- x 0))
(define (b x) (+ x 0))
(define (c x) (+ 0 x))
(define (d x) (* 1 x))
(define (e x) (* 0 x))
(define (f x) (quotient x 1))
(define (g x) (remainder x 1)) [lindv2:Arrays/srfi3/gsc-test] lucier% gsc -c -expansion test.scm Expansion:
(define a:2 (lambda (x:3) (if (and (##eq?:4 -:5 '#<procedure #9 ->) (##fixnum?:6 x:3)) (let ((temp.2:7 (##fixnum.-?:8 x:3 0))) (if temp.2:7 temp. 2:7 (-:5 x:3 0))) (-:5 x:3 0))))
(define b:10 (lambda (x:11) (if (and (##eq?:4 +:12 '#<procedure #15 +>) (##fixnum?:6 x:11)) (let ((temp.5:13 (##fixnum.+?:14 x:11 0))) (if temp.5:13 temp.5:13 (+:12 x:11 0))) (+:12 x:11 0))))
(define c:16 (lambda (x:17) (if (and (##eq?:4 +:12 '#<procedure #15 +>) (and (##fixnum?:6 x: 17) #t)) (let ((temp.8:18 (##fixnum.+?:14 0 x:17))) (if temp.8:18 temp.8:18 (+:12 0 x:17))) (+:12 0 x:17))))
(define d:19 (lambda (x:20) (if (and (##eq?:4 *:21 '#<procedure #25 *>) (and (##fixnum?:6 x: 20) #t)) (if (##eqv?:22 x:20 0) 0 (let ((temp.11:23 (if (##eqv?:22 x:20 -1) -1 (##fixnum.*?:24 1 x:20)))) (if temp.11:23 temp.11:23 (*:21 1 x:20)))) (*:21 1 x:20))))
(define e:26 (lambda (x:27) (if (and (##eq?:4 *:21 '#<procedure #25 *>) (and (##fixnum?:6 x: 27) #t)) (if (##eqv?:22 x:27 0) 0 (let ((temp.14:28 (if (##eqv?:22 x:27 -1) 0 (##fixnum.*?: 24 0 x:27)))) (if temp.14:28 temp.14:28 (*:21 0 x:27)))) (*:21 0 x:27))))
(define f:29 (lambda (x:30) (if (and (##eq?:4 quotient:31 '#<procedure #33 quotient>) (and (##fixnum?:6 x:30) #t)) (##fixnum.quotient:32 x:30 1) (quotient:31 x:30 1))))
(define g:34 (lambda (x:35) (if (and (##eq?:4 remainder:36 '#<procedure #38 remainder>) (and (##fixnum?:6 x:35) #t)) (##fixnum.remainder:37 x:35 1) (remainder:36 x:35 1))))