mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-24 12:35:05 +02:00
Issue #130 - Inline constant values
This commit is contained in:
parent
f3f5df4f9c
commit
e19c4db19d
2 changed files with 29 additions and 1 deletions
|
@ -8,6 +8,7 @@ Features:
|
||||||
- Thanks to ecraven, added R7RS function `exact-integer-sqrt` to `(scheme base)`.
|
- Thanks to ecraven, added R7RS function `exact-integer-sqrt` to `(scheme base)`.
|
||||||
- Allow the reader to recognize `+inf.0`, `-inf.0`, `+nan.0`, and `-nan.0`.
|
- Allow the reader to recognize `+inf.0`, `-inf.0`, `+nan.0`, and `-nan.0`.
|
||||||
- Allow `cond-expand` to test for whether a library exists using the form `(library {library name})`.
|
- Allow `cond-expand` to test for whether a library exists using the form `(library {library name})`.
|
||||||
|
- Reduce size of compiled code by inlining constant values. This reduced the code size of various cyclone libraries by approximately 33%.
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
|
|
||||||
|
|
|
@ -470,6 +470,33 @@
|
||||||
;; TODO: check for more than one arg??
|
;; TODO: check for more than one arg??
|
||||||
(equal? (length (cdr exp))
|
(equal? (length (cdr exp))
|
||||||
(length (ast:lambda-formals->list (car exp))))
|
(length (ast:lambda-formals->list (car exp))))
|
||||||
|
(or
|
||||||
|
;; This "and" is not for primitives, but rather checking
|
||||||
|
;; for constants to optimize out. This just happens to be
|
||||||
|
;; a convenient place since the optimization is the same.
|
||||||
|
(and
|
||||||
|
;; Check each parameter
|
||||||
|
(every
|
||||||
|
(lambda (param)
|
||||||
|
(with-var param (lambda (var)
|
||||||
|
(and
|
||||||
|
;; At least for now, do not replace if referenced by multiple functions
|
||||||
|
(<= (length (adbv:ref-by var)) 1)
|
||||||
|
;; Need to keep variable because it is mutated
|
||||||
|
(not (adbv:reassigned? var))
|
||||||
|
))))
|
||||||
|
(ast:lambda-formals->list (car exp)))
|
||||||
|
;; Args are all constants
|
||||||
|
(every
|
||||||
|
(lambda (arg)
|
||||||
|
(and
|
||||||
|
arg ;; #f is a special value for init, so do not optimize it for now
|
||||||
|
(or (const? arg)
|
||||||
|
(quote? arg))))
|
||||||
|
(cdr exp))
|
||||||
|
)
|
||||||
|
;; Check for primitive calls that can be optimized out
|
||||||
|
(and
|
||||||
;; Double-check parameter can be optimized-out
|
;; Double-check parameter can be optimized-out
|
||||||
(every
|
(every
|
||||||
(lambda (param)
|
(lambda (param)
|
||||||
|
@ -498,7 +525,7 @@
|
||||||
(inline-prim-call?
|
(inline-prim-call?
|
||||||
(ast:lambda-body (car exp))
|
(ast:lambda-body (car exp))
|
||||||
(prim-calls->arg-variables (cdr exp))
|
(prim-calls->arg-variables (cdr exp))
|
||||||
(ast:lambda-formals->list (car exp)))
|
(ast:lambda-formals->list (car exp)))))
|
||||||
)
|
)
|
||||||
(let ((args (cdr exp)))
|
(let ((args (cdr exp)))
|
||||||
(for-each
|
(for-each
|
||||||
|
|
Loading…
Add table
Reference in a new issue