mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
Improve code generation for eq? on immediates
* module/language/tree-il/compile-bytecode.scm (canonicalize): * module/language/tree-il/compile-cps.scm (canonicalize): Specialize eq-false? and similar predicates.
This commit is contained in:
parent
aa44a71750
commit
f13b27a4cc
2 changed files with 33 additions and 0 deletions
|
@ -422,6 +422,20 @@
|
|||
(($ <primcall> src '>= (a b)) (reify-branch src '<= (list b a)))
|
||||
(($ <primcall> src '> (a b)) (reify-branch src '< (list b a)))
|
||||
|
||||
;; Specialize eq?.
|
||||
(($ <primcall> src 'eq? (a b))
|
||||
(let ((a (if (const? b) a b))
|
||||
(b (if (const? b) b a)))
|
||||
(define (simplify test) (reify-branch src test (list a)))
|
||||
(match b
|
||||
(($ <const> _ '()) (simplify 'eq-null?))
|
||||
(($ <const> _ #f) (simplify 'eq-false?))
|
||||
(($ <const> _ #t) (simplify 'eq-true?))
|
||||
(($ <const> _ #nil) (simplify 'eq-nil?))
|
||||
(($ <const> _ (? unspecified?)) (simplify 'unspecified?))
|
||||
(($ <const> _ (? eof-object?)) (simplify 'eof-object?))
|
||||
(_ (reify-branch src 'eq? (list a b))))))
|
||||
|
||||
;; Simplify "not".
|
||||
(($ <primcall> src 'not (x))
|
||||
(finish-conditional
|
||||
|
|
|
@ -2365,6 +2365,25 @@ integer."
|
|||
(make-const src #t)
|
||||
(make-const src #f)))
|
||||
|
||||
;; Specialize eq?.
|
||||
(($ <primcall> src 'eq? (a b))
|
||||
(define (reify-branch test args)
|
||||
;; No need to reduce as test is a branching primitive.
|
||||
(make-conditional src (make-primcall src test args)
|
||||
(make-const src #t)
|
||||
(make-const src #f)))
|
||||
(let ((a (if (const? b) a b))
|
||||
(b (if (const? b) b a)))
|
||||
(define (simplify test) (reify-branch test (list a)))
|
||||
(match b
|
||||
(($ <const> _ '()) (simplify 'eq-null?))
|
||||
(($ <const> _ #f) (simplify 'eq-false?))
|
||||
(($ <const> _ #t) (simplify 'eq-true?))
|
||||
(($ <const> _ #nil) (simplify 'eq-nil?))
|
||||
(($ <const> _ (? unspecified?)) (simplify 'unspecified?))
|
||||
(($ <const> _ (? eof-object?)) (simplify 'eof-object?))
|
||||
(_ (reify-branch 'eq? (list a b))))))
|
||||
|
||||
(($ <primcall> src (? branching-primitive? name) args)
|
||||
;; No need to reduce because test is not reducible: reifying
|
||||
;; #t/#f is the right thing.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue