2890 lines
119 KiB
Scheme
2890 lines
119 KiB
Scheme
;;; cp0.ms
|
|
;;; Copyright 1984-2017 Cisco Systems, Inc.
|
|
;;;
|
|
;;; Licensed under the Apache License, Version 2.0 (the "License");
|
|
;;; you may not use this file except in compliance with the License.
|
|
;;; You may obtain a copy of the License at
|
|
;;;
|
|
;;; http://www.apache.org/licenses/LICENSE-2.0
|
|
;;;
|
|
;;; Unless required by applicable law or agreed to in writing, software
|
|
;;; distributed under the License is distributed on an "AS IS" BASIS,
|
|
;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
;;; See the License for the specific language governing permissions and
|
|
;;; limitations under the License.
|
|
|
|
(define-syntax cp0-mat
|
|
(syntax-rules ()
|
|
[(_ name form ...)
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(mat name form ...))]))
|
|
|
|
(cp0-mat cp0-regression
|
|
; test to keep cp0 honest about letrec's implicit assignment
|
|
#;(letrec ((x (call/cc (lambda (k) k)))) ; invalid in r6rs
|
|
(let ((y x))
|
|
(y (lambda (z) (not (eq? x y))))))
|
|
; make sure compiler doesn't loop...
|
|
(begin
|
|
(define omega
|
|
(lambda ()
|
|
((lambda (x) (x x)) (lambda (x) (x x)))))
|
|
(procedure? omega))
|
|
; make sure cp0 doesn't assume read returns #t
|
|
(not (read (open-input-string "#f")))
|
|
; test proper visiting of assigned variables
|
|
(letrec ((x (lambda () x)) (y (lambda () x)))
|
|
(set! y (y))
|
|
(eq? y (y)))
|
|
; test proper quote propagation from seq w/side effect
|
|
(equal?
|
|
(let ((x 0))
|
|
(let ((y (begin (set! x (+ x 1)) 0)))
|
|
(let ((z (+ y 1)))
|
|
(list x z))))
|
|
'(1 1))
|
|
; test that we reset integrated? flags for outer calls when we bug out of
|
|
; an inner call in cases where operator of call is itself a call
|
|
(begin
|
|
(define whack! (lambda () (set! whack! 'okay)))
|
|
(define ignore list)
|
|
(letrec ([g
|
|
(lambda x
|
|
((lambda (x)
|
|
(ignore)
|
|
(when (null? x) (g #f))
|
|
(lambda (y) (ignore x y y y)))
|
|
(ignore (ignore ignore))))])
|
|
((g) (whack!)))
|
|
(eq? whack! 'okay))
|
|
; make sure cp0 does not go to lala land
|
|
(error? (letrec ((x x)) x))
|
|
; make sure residual assignments to unref'd vars don's blow
|
|
(eq? (let ((x (void)))
|
|
(set! x 0)
|
|
(letrec ((f (lambda () (set! x (+ x 1)) x)) (g (lambda (x) x)))
|
|
(g 3)))
|
|
3)
|
|
(eq? (let ()
|
|
(define kons-proc
|
|
(lambda (a) (lambda (b) (lambda (g) ((g a) b)))))
|
|
(define-syntax kons
|
|
(syntax-rules () [(_ x y) ((kons-proc x) y)]))
|
|
(define kar (lambda (pr) (pr (lambda (a) (lambda (b) a)))))
|
|
(define kdr (lambda (pr) (pr (lambda (a) (lambda (b) b)))))
|
|
((kar (kons (lambda (x y) (kar (kons x y)))
|
|
(kons (lambda (x y) (kdr (kons x y)))
|
|
(lambda (x y) (kdr (kar (kons (kons x y) 'nil)))))))
|
|
3 4))
|
|
3)
|
|
; test for various bugs fixed in 5.9i, all relating to resetting an
|
|
; outer context when we abort from an inner one
|
|
(begin
|
|
(define **a 1)
|
|
(define-syntax **huge
|
|
(identifier-syntax
|
|
(set! **output
|
|
(cons
|
|
(list (list **a **a **a **a **a **a **a **a **a **a)
|
|
(list **a **a **a **a **a **a **a **a **a **a)
|
|
(list **a **a **a **a **a **a **a **a **a **a)
|
|
(list **a **a **a **a **a **a **a **a **a **a)
|
|
(list **a **a **a **a **a **a **a **a **a **a))
|
|
**output))))
|
|
(define **test-output
|
|
(case-lambda
|
|
[(th) (**test-output 1 th)]
|
|
[(n th)
|
|
(set! **output '())
|
|
(and (th)
|
|
(equal? **output
|
|
(make-list n
|
|
'((1 1 1 1 1 1 1 1 1 1)
|
|
(1 1 1 1 1 1 1 1 1 1)
|
|
(1 1 1 1 1 1 1 1 1 1)
|
|
(1 1 1 1 1 1 1 1 1 1)
|
|
(1 1 1 1 1 1 1 1 1 1)))))]))
|
|
(**test-output (lambda () **huge #t)))
|
|
(**test-output
|
|
(lambda ()
|
|
(equal?
|
|
(let ((f (lambda ()
|
|
(let ((x **huge))
|
|
(let ((g (lambda () x)))
|
|
(g) memq)))))
|
|
((f) (+ 1 2) '(1 2 3 4 5)))
|
|
'(3 4 5))))
|
|
(**test-output
|
|
(lambda ()
|
|
(equal?
|
|
(let ((f (lambda ()
|
|
(let ((x **huge))
|
|
(let ((g (begin 0 (lambda () x)))) (g) memq)))))
|
|
((f) (+ 1 2) '(1 2 3 4 5)))
|
|
'(3 4 5))))
|
|
(**test-output
|
|
(lambda ()
|
|
(equal?
|
|
(let ((f (lambda ()
|
|
(let ((x **huge))
|
|
(let ((g (lambda () x))) (g) (g) memq)))))
|
|
((f) (+ 1 2) '(1 2 3 4 5)))
|
|
'(3 4 5))))
|
|
(**test-output
|
|
(lambda ()
|
|
(eq?
|
|
(let ((f (lambda () (let ((x **huge)) (lambda (y z) (or (= y 3) x))))))
|
|
((f) (+ 1 2) 4))
|
|
#t)))
|
|
(**test-output 2
|
|
(lambda ()
|
|
(eq? (let ((f (lambda ()
|
|
(let ((x **huge)) (lambda (y z) (or (= y 3) x))))))
|
|
((f) (+ 1 2) 4)
|
|
((f) (+ 1 2) 4))
|
|
#t)))
|
|
(**test-output 2
|
|
(lambda ()
|
|
(eq?
|
|
(let ((f (lambda ()
|
|
(let ((x **huge)) (lambda (y z) (if (y z) 'ok x))))))
|
|
((f) + 3)
|
|
((f) + 3))
|
|
'ok)))
|
|
(eq?
|
|
(let ((f (lambda () (let ((x 0)) (lambda (y z) (if (y z) 'ok x))))))
|
|
((f) + 3))
|
|
'ok)
|
|
(not (let ((f (lambda (x)
|
|
(eq? (begin (set! x 4) x)
|
|
(begin (set! x 5) x)))))
|
|
(f 'a)))
|
|
(not (let ((f #f) (g #f))
|
|
(let ((x 0))
|
|
(set! g (lambda () (eq? (begin (f) x) (begin (f) x))))
|
|
(set! f (lambda () (set! x (+ x 1))))
|
|
(g))))
|
|
(eq? (let ([g% (lambda (cp)
|
|
(let ([t1 0])
|
|
(set! t1 (car cp))
|
|
(let ([t2 t1]) 4)))])
|
|
g%
|
|
(g% '(0)))
|
|
4)
|
|
(error? (let ((f (lambda (x) x))) (let ((g f)) (g))))
|
|
(begin
|
|
(define $foo$
|
|
(letrec ((func1
|
|
(lambda (cont0)
|
|
(cont0 'x)))) ; incorrect # args to cont0 (func3)
|
|
(lambda ()
|
|
(letrec ((func3
|
|
(lambda (cont2 x)
|
|
(cont2 x))))
|
|
(lambda ()
|
|
(func1 func3))))))
|
|
#t)
|
|
(error? (($foo$)))
|
|
(begin
|
|
(define $foo$
|
|
(letrec ((func1
|
|
(lambda (cont0)
|
|
(cont0 list 'x)))) ; correct # args to cont0 (func3)
|
|
(lambda ()
|
|
(letrec ((func3
|
|
(lambda (cont2 x)
|
|
(cont2 x))))
|
|
(lambda ()
|
|
(func1 func3))))))
|
|
#t)
|
|
(equal? (($foo$)) '(x))
|
|
; make sure cpletrec doesn't toss bindings for assigned variables
|
|
(equal?
|
|
(let ()
|
|
(define *root* '())
|
|
(define (init-traverse) (set! *root* 0))
|
|
(define (run-traverse) (traverse *root*))
|
|
(init-traverse))
|
|
(void))
|
|
; make sure nested cp0 doesn't assimilate letrec bindings when
|
|
; body is simple but not pure
|
|
((lambda (x ls) (and (member x ls) #t))
|
|
(let ([x 0])
|
|
(letrec ([a (letrec ([b (set! x 1)]) x)]
|
|
[c (letrec ([d (set! x 2)]) x)])
|
|
(list a c)))
|
|
'((1 2) (2 1)))
|
|
((lambda (x ls) (and (member x ls) #t))
|
|
(let ([x 0])
|
|
(letrec ([a (letrec ([b x]) (set! x 1) b)]
|
|
[c (letrec ([d x]) (set! x 2) d)])
|
|
(list a c x)))
|
|
'((2 0 1) (0 1 2)))
|
|
; make sure (r6rs:fx+ x 0) isn't folded to (r6rs:fx+ x), since
|
|
; r6rs:fx+ doesn't accept just one argument.
|
|
(begin
|
|
(define $cp0-f (let ([z 0]) (lambda (x) (r6rs:fx+ x z))))
|
|
(define $cp0-g (let ([z 0]) (lambda (x) (r6rs:fx* x 1))))
|
|
#t)
|
|
(eqv? ($cp0-f 17) 17)
|
|
(eqv? ($cp0-g 17) 17)
|
|
(error? ($cp0-f 'a))
|
|
(error? ($cp0-g 'a))
|
|
; make sure cp0 isn't overeager about moving discardable but
|
|
; not pure primitive calls
|
|
(and
|
|
(member
|
|
(let ([p (cons 1 2)])
|
|
(list
|
|
(let ([x (car p)]) (set-car! p 3) x)
|
|
(let ([x (car p)]) (set-car! p 4) x)))
|
|
'((4 1) (1 3)))
|
|
#t)
|
|
; make sure cp0 doesn't screw up on an "almost" or pattern
|
|
(error? ; #f is not a number
|
|
(if (let ([x (eqv? (random 2) 2)]) (if x x (+ x 1))) 4 5))
|
|
(begin
|
|
(define f
|
|
(lambda (x)
|
|
(letrec ([foo (lambda (ls)
|
|
(let loop ([ls ls] [rls '()])
|
|
(if (null? ls)
|
|
rls
|
|
(loop (cdr ls) (cons (car ls) rls)))))])
|
|
(apply foo (list x)))))
|
|
#t)
|
|
(equal?
|
|
(f (list 1 2))
|
|
'(2 1))
|
|
(begin
|
|
(define f
|
|
(lambda (x)
|
|
(letrec ([foo (lambda (x ls)
|
|
(let loop ([ls ls] [rls '()])
|
|
(if (null? ls)
|
|
(cons x rls)
|
|
(loop (cdr ls) (cons (car ls) rls)))))])
|
|
(apply (begin (write 'a) foo) (begin (write 'b) 'bar) (begin (write 'c) (list x))))))
|
|
#t)
|
|
(equal?
|
|
(f (list 1 2))
|
|
'(bar 2 1))
|
|
((lambda (x ls) (and (member x ls) #t))
|
|
(with-output-to-string (lambda () (f (list 1 2))))
|
|
'("abc" "acb" "bac" "bca" "cab" "cba"))
|
|
(begin
|
|
(define $x 17)
|
|
#t)
|
|
((lambda (x ls) (and (member x ls) #t))
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(apply
|
|
(begin (write 'a) member)
|
|
(begin (write 'b) $x)
|
|
(begin (write 'c) (list (begin (write 'd) '()))))))
|
|
'("abcd" "acdb" "bacd" "bcda" "cdab" "cdba"))
|
|
((lambda (x ls) (and (member x ls) #t))
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(apply
|
|
(begin (write 'a) ash)
|
|
(begin (write 'b) $x)
|
|
(begin (write 'c) (list (begin (write 'd) 0))))))
|
|
'("abcd" "acdb" "bacd" "bcda" "cdab" "cdba"))
|
|
; check to see if this turns up a missing referenced flag due to an extra
|
|
; binding for p. (missing referenced flags are presently detected only when
|
|
; cpletrec is compiled with d=k, k > 0.)
|
|
(equal?
|
|
(apply (let ([p (box 0)]) (lambda () p)) '())
|
|
'#&0)
|
|
; check for some corrected flags
|
|
(not (and (record-type-parent #!base-rtd) #t))
|
|
(error? ; invalid report specifier
|
|
(begin
|
|
(null-environment #f)
|
|
#t))
|
|
(error? ; not a source object
|
|
(begin
|
|
(source-object-bfp #f)
|
|
#t))
|
|
(error? ; not a source object
|
|
(begin
|
|
(source-object-efp #f)
|
|
#t))
|
|
(error? ; not a source object
|
|
(begin
|
|
(source-object-sfd #f)
|
|
#t))
|
|
(error? ; not a condition
|
|
(begin
|
|
(condition #f)
|
|
#t))
|
|
; nested if optimization
|
|
(begin
|
|
(define $cp0-f
|
|
(lambda (x y a b c)
|
|
(if (if (if (if (#3%zero? (a)) #f #t) (begin (b) #t) #f)
|
|
(c)
|
|
#f)
|
|
(x)
|
|
(y))))
|
|
#t)
|
|
(equal?
|
|
(with-output-to-string
|
|
(lambda ()
|
|
($cp0-f
|
|
(lambda () (printf "x\n"))
|
|
(lambda () (printf "y\n"))
|
|
(lambda () (printf "a\n") 0)
|
|
(lambda () (printf "b\n"))
|
|
(lambda () (printf "c\n") #t))))
|
|
"a\ny\n")
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
'(lambda (x y a b c)
|
|
(if (if (if (if (#3%zero? (a)) #f #t) (begin (b) #t) #f)
|
|
(c)
|
|
#f)
|
|
(x)
|
|
(y))))
|
|
'(lambda (x y a b c)
|
|
(if (if (#3%zero? (a))
|
|
#f
|
|
(begin (b) (c)))
|
|
(x)
|
|
(y))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
'(lambda (x y a b c)
|
|
(if (if (if (not (#3%zero? (a))) (begin (b) #t) #f)
|
|
(c)
|
|
#f)
|
|
(x)
|
|
(y))))
|
|
'(lambda (x y a b c)
|
|
(if (if (#3%zero? (a))
|
|
#f
|
|
(begin (b) (c)))
|
|
(x)
|
|
(y))))
|
|
(error? (apply zero? 0))
|
|
(error? (if (apply eof-object 1 2) 3 4))
|
|
; test for folding of multiple-value primitives
|
|
(equivalent-expansion?
|
|
(expand/optimize '(lambda () (div-and-mod 7 3)))
|
|
'(lambda () (#3%values 2 1)))
|
|
(equivalent-expansion?
|
|
(expand/optimize '(lambda () (exact-integer-sqrt 19)))
|
|
'(lambda () (#3%values 4 3)))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
'(call-with-values
|
|
(lambda () (div-and-mod 7 3))
|
|
(lambda (x y) (#2%cons (* x 10) (/ y 10)))))
|
|
'(#2%cons 20 1/10))
|
|
)
|
|
|
|
(cp0-mat cp0-mrvs
|
|
(eqv? (call-with-values (lambda () (values 1 2 3)) +) 6)
|
|
(begin
|
|
(define **cwv-test
|
|
(lambda (out p)
|
|
(define x '())
|
|
(define pp (lambda (a) (set! x (cons a x))))
|
|
(and (p pp)
|
|
(if (procedure? out)
|
|
(out (reverse x))
|
|
(equal? (reverse x) out)))))
|
|
(**cwv-test '(1 2 2 3)
|
|
(lambda (pretty-print)
|
|
(pretty-print 1)
|
|
(pretty-print 2)
|
|
(pretty-print 2)
|
|
(pretty-print 3)
|
|
#t)))
|
|
(**cwv-test '(1 1 2 3)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values
|
|
(begin
|
|
(pretty-print 1)
|
|
(lambda () (pretty-print 2) (+ 1 2 3)))
|
|
(begin
|
|
(pretty-print 1)
|
|
(lambda (n) (pretty-print 3) (list n n n))))
|
|
'(6 6 6))))
|
|
(**cwv-test '(1 1 2 3)
|
|
(lambda (pretty-print)
|
|
(eqv?
|
|
(call-with-values
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda () (pretty-print '2) (values 1 2 3)))
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda (a b c) (pretty-print '3) (+ c b a))))
|
|
6)))
|
|
(**cwv-test '(1 1 2 3 4)
|
|
(lambda (pretty-print)
|
|
(eqv?
|
|
(call-with-values
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda ()
|
|
(pretty-print '2)
|
|
(values 1 (begin (pretty-print '3) 2) 3)))
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda (a b c) (pretty-print '4) (+ c b a))))
|
|
6)))
|
|
(begin
|
|
(define **foo (lambda () (values 'a 'b 'c)))
|
|
(define **bar vector)
|
|
(equal? (call-with-values **foo **bar) '#(a b c)))
|
|
(equal?
|
|
(call-with-values
|
|
(lambda () (values 1 2 3))
|
|
(case-lambda [(x) (list x x x)] [(a b c) (list c b a)]))
|
|
'(3 2 1))
|
|
(equal? (call-with-values (lambda () (values 1 2 3)) **bar) '#(1 2 3))
|
|
(**cwv-test '(1 2)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values
|
|
(lambda () (pretty-print '2) (values 1 2 3))
|
|
(begin (pretty-print '1) **bar))
|
|
'#(1 2 3))))
|
|
(**cwv-test '(1 1 2)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda () (pretty-print '2) (values 1 2 3)))
|
|
(begin (pretty-print '1) **bar))
|
|
'#(1 2 3))))
|
|
(equal? (call-with-values **foo (lambda (a b c) (list c b a))) '(c b a))
|
|
(equal? (let ((f (lambda (a b c) (list c b a))))
|
|
(call-with-values **foo f))
|
|
'(c b a))
|
|
(**cwv-test '(1)
|
|
(lambda (pretty-print)
|
|
(equal? (call-with-values
|
|
**foo
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda (a b c) (vector c b a))))
|
|
'#(c b a))))
|
|
(**cwv-test (lambda (x) (or (equal? x '(1 2 3)) (equal? x '(2 3 4))))
|
|
(lambda (pretty-print)
|
|
(define n 1)
|
|
(define boof
|
|
(lambda ()
|
|
(pretty-print 3)
|
|
(lambda (a b c) (list c b a))))
|
|
(equal?
|
|
(call-with-values
|
|
(begin (pretty-print n) **foo)
|
|
(begin (set! n 4) (pretty-print 2) (boof)))
|
|
'(c b a))))
|
|
(**cwv-test '(1 2 3)
|
|
(lambda (pretty-print)
|
|
(define n 1)
|
|
(define boof
|
|
(lambda ()
|
|
(pretty-print 3)
|
|
(lambda (a b c) (list c b a))))
|
|
(equal?
|
|
(let* ((prod (begin (pretty-print n) **foo))
|
|
(csmr (begin (set! n 4) (pretty-print 2) (boof))))
|
|
(call-with-values prod csmr))
|
|
'(c b a))))
|
|
(**cwv-test '(2 3 4)
|
|
(lambda (pretty-print)
|
|
(define n 1)
|
|
(define boof
|
|
(lambda ()
|
|
(pretty-print 3)
|
|
(lambda (a b c) (list c b a))))
|
|
(equal?
|
|
(let* ((csmr (begin (set! n 4) (pretty-print 2) (boof)))
|
|
(prod (begin (pretty-print n) **foo)))
|
|
(call-with-values prod csmr))
|
|
'(c b a))))
|
|
(**cwv-test '(1 1)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values
|
|
(begin
|
|
(pretty-print '1)
|
|
**foo)
|
|
(begin
|
|
(pretty-print '1)
|
|
(lambda (a b c) (list c b a))))
|
|
'(c b a))))
|
|
(begin
|
|
(set! **a #t)
|
|
(equal?
|
|
(call-with-values
|
|
(lambda () (if **a (values 1) (values 1 2 3)))
|
|
(case-lambda [(x) (list x x x)] [(a b c) (list c b a)]))
|
|
'(1 1 1)))
|
|
(begin
|
|
(set! **a #f)
|
|
(equal?
|
|
(call-with-values
|
|
(lambda () (if **a (values 1) (values 1 2 3)))
|
|
(case-lambda [(x) (list x x x)] [(a b c) (list c b a)]))
|
|
'(3 2 1)))
|
|
(begin
|
|
(set! **a #t)
|
|
(equal?
|
|
(let ((f (lambda (a) (if **a (values 1) (values 1 2 3)))))
|
|
(call-with-values
|
|
(lambda () (f #t))
|
|
(case-lambda [(x) (list x x x)] [(a b c) (list c b a)])))
|
|
'(1 1 1)))
|
|
(begin
|
|
(set! **a #f)
|
|
(equal?
|
|
(let ((f (lambda (a) (if **a (values 1) (values 1 2 3)))))
|
|
(call-with-values
|
|
(lambda () (f #t))
|
|
(case-lambda [(x) (list x x x)] [(a b c) (list c b a)])))
|
|
'(3 2 1)))
|
|
(equal?
|
|
(call-with-values
|
|
(lambda ()
|
|
(define foo
|
|
(lambda (x)
|
|
(if (zero? x)
|
|
(values 1 2 3)
|
|
(call-with-values
|
|
(lambda () (foo (- x 1)))
|
|
(lambda (a b c)
|
|
(values (+ a 1) (+ b a) (+ c 2)))))))
|
|
(call-with-values
|
|
(lambda () (foo 0))
|
|
(lambda (a b c)
|
|
(foo (+ a b c)))))
|
|
list)
|
|
'(7 23 15))
|
|
(equal?
|
|
(let ((f (lambda ()
|
|
(let loop ((n 10))
|
|
(if (zero? n)
|
|
call-with-values
|
|
(loop (fx- n 1)))))))
|
|
((f) (lambda () (values 1 2)) cons))
|
|
'(1 . 2))
|
|
(equal?
|
|
(let ()
|
|
(define (go n)
|
|
(let ((f (lambda ()
|
|
(let loop ((n n))
|
|
(if (zero? n)
|
|
call-with-values
|
|
(loop (fx- n 1)))))))
|
|
((f) (lambda () (values 1 2)) cons)))
|
|
(go 1000))
|
|
'(1 . 2))
|
|
(begin
|
|
(define **bozo
|
|
(lambda (pretty-print)
|
|
(pretty-print '3)
|
|
(lambda x
|
|
(pretty-print 6)
|
|
x)))
|
|
(define **clown (lambda () (values 1 2 3)))
|
|
(**cwv-test '(3 6)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values **clown (**bozo pretty-print))
|
|
'(1 2 3)))))
|
|
(**cwv-test '(1 2)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(let ((f (lambda () (pretty-print '2) (values 1 2 3))))
|
|
(call-with-values
|
|
(begin (pretty-print '1) f)
|
|
(lambda x x)))
|
|
'(1 2 3))))
|
|
(**cwv-test '(1 2)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(let ((f (lambda () (pretty-print '2) (**foo))))
|
|
(call-with-values
|
|
(begin (pretty-print '1) f)
|
|
(lambda x x)))
|
|
'(a b c))))
|
|
(**cwv-test '(1 2 3 4)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(let ([f
|
|
(lambda ()
|
|
(pretty-print '2)
|
|
(lambda () (pretty-print '3) (**foo)))])
|
|
(call-with-values
|
|
(begin (pretty-print '1) (f))
|
|
(lambda x (pretty-print 4) x)))
|
|
'(a b c))))
|
|
(**cwv-test '(1)
|
|
(lambda (pretty-print)
|
|
(equal?
|
|
(call-with-values
|
|
(begin (pretty-print '1) (lambda () (**foo)))
|
|
(lambda (x y z) (list y z x)))
|
|
'(b c a))))
|
|
(procedure?
|
|
(lambda ()
|
|
(define test1 (lambda () void))
|
|
(define test2
|
|
(lambda ()
|
|
(call-with-values test1 (lambda (tester) (tester)))))
|
|
(test2)))
|
|
(eqv?
|
|
(let ()
|
|
(define test1 (lambda (x) (values (lambda () (+ x 1)))))
|
|
(define test2
|
|
(lambda (x)
|
|
(let-values ([(tester) (test1 x)])
|
|
(tester))))
|
|
(test2 10))
|
|
11)
|
|
)
|
|
|
|
(cp0-mat apply-partial-folding
|
|
(test-cp0-expansion
|
|
'(apply fx+ '(1 2 3 4 5))
|
|
15)
|
|
(test-cp0-expansion
|
|
'(apply fx+ 3 x 4 '(5 7 9))
|
|
(if (eqv? (optimize-level) 3)
|
|
'(#3%fx+ 28 x)
|
|
'(#2%fx+ 28 x)))
|
|
(test-cp0-expansion
|
|
'(apply fx+ 3 x 4 (begin (write 'hi) '(5 7 9)))
|
|
(if (eqv? (optimize-level) 3)
|
|
'(let ([g x]) (#3%write 'hi) (#3%fx+ 28 g))
|
|
'(let ([g x]) (#2%write 'hi) (#2%fx+ 28 g))))
|
|
(test-cp0-expansion
|
|
'(apply fx+ 3 x 4 '(5 7 9.0))
|
|
(if (eqv? (optimize-level) 3)
|
|
'(#3%fx+ 19 x 9.0)
|
|
'(#2%fx+ 19 x 9.0)))
|
|
(test-cp0-expansion
|
|
`(apply apply '(,list 2 3 (4 5 6)))
|
|
`(',list 2 3 4 5 6))
|
|
(test-cp0-expansion
|
|
`(#3%apply #3%apply #3%+ '(1 (2 3 4)))
|
|
10)
|
|
(test-cp0-expansion
|
|
`(apply apply apply + 1 '(2 3 (4 5 (6 7))))
|
|
28)
|
|
(test-cp0-expansion
|
|
`(let ([f apply]) (f f f * 1 '(2 3 (4 5 (6)))))
|
|
720)
|
|
(test-cp0-expansion
|
|
`(lambda (x) (apply (lambda (prim ls) (apply prim ls)) zero? (list x)))
|
|
(if (eqv? (optimize-level) 3)
|
|
'(lambda (x) (#3%apply #3%zero? x))
|
|
'(lambda (x) (#2%apply #2%zero? x))))
|
|
(test-cp0-expansion
|
|
`(apply (lambda (prim ls) (apply prim ls)) zero? (list (cons 0 '())))
|
|
#t)
|
|
(test-cp0-expansion
|
|
`(apply (lambda (prim ls) (apply prim ls)) zero? (cons 0 '()))
|
|
(if (eqv? (optimize-level) 3)
|
|
'(#3%apply #3%zero? 0)
|
|
'(#2%apply #2%zero? 0)))
|
|
)
|
|
|
|
(mat expand/optimize
|
|
(error? (expand/optimize))
|
|
(error? (expand/optimize 'a 'b))
|
|
(error? (expand/optimize 'a 'b 'c))
|
|
(eqv? (parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))])
|
|
(expand/optimize 3))
|
|
3)
|
|
(equal? (parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))])
|
|
(expand/optimize '(#2%cdr '(3 4))))
|
|
''(4))
|
|
(eqv? (parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level 2])
|
|
(expand/optimize ; from cp0 talk
|
|
'(let ([n (expt 2 10)])
|
|
(define even?
|
|
(lambda (x) (or (zero? x) (not (odd? x)))))
|
|
(define odd?
|
|
(lambda (x) (not (even? (- x 1)))))
|
|
(define f
|
|
(lambda (x)
|
|
(lambda (y)
|
|
(lambda (z)
|
|
(if (= z 0) (omega) (+ x y z))))))
|
|
(define omega
|
|
(lambda ()
|
|
((lambda (x) (x x)) (lambda (x) (x x)))))
|
|
(let ([g (f 1)] [m (f n)])
|
|
(let ([h
|
|
(if (> ((g 2) 3) 5)
|
|
(lambda (x) (+ x 1))
|
|
odd?)])
|
|
(h n))))))
|
|
1025)
|
|
(let ([x (parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize ; from mwbor talk
|
|
'(let ()
|
|
(import scheme)
|
|
(define opcode-pos 27)
|
|
(define src1-pos 22)
|
|
(define src2-pos 0)
|
|
(define dst-pos 17)
|
|
(define imm-bit (ash 1 16))
|
|
(define regops '((ld . 22) (add . 28)))
|
|
(define immops '((addi . 28)))
|
|
(define regcodes
|
|
'((r0 . 0) (r1 . 1) (r2 . 2) (r3 . 3)))
|
|
(define-syntax reg
|
|
(syntax-rules ()
|
|
[(_ r) (cdr (assq 'r regcodes))]))
|
|
(define imm
|
|
(lambda (n)
|
|
(unless (< -32768 n 32767)
|
|
(errorf 'imm "invalid immediate ~s" n))
|
|
n))
|
|
(define $emit!
|
|
(lambda (op a1 a2 a3)
|
|
(emit-word!
|
|
(+ (cond
|
|
[(assq op regops) =>
|
|
(lambda (a)
|
|
(ash (cdr a) opcode-pos))]
|
|
[(assq op immops) =>
|
|
(lambda (a)
|
|
(+ (ash (cdr a) opcode-pos)
|
|
imm-bit))]
|
|
[else
|
|
(errorf 'emit
|
|
"unrecognized operator ~s"
|
|
op)])
|
|
(ash a1 src1-pos)
|
|
(ash a2 src2-pos)
|
|
(ash a3 dst-pos)))))
|
|
(define-syntax emit
|
|
(syntax-rules ()
|
|
[(_ op a1 a2 a3) ($emit! 'op a1 a2 a3)]))
|
|
(set! test
|
|
(lambda (r)
|
|
(emit ld (reg r0) (reg r1) (reg r2))
|
|
(emit addi (reg r2) 320 (reg r2))
|
|
(emit add (reg r2) r (reg r2)))))))])
|
|
(and
|
|
(equivalent-expansion? x
|
|
'(set! test
|
|
(lambda (r)
|
|
(emit-word! 2953052161)
|
|
(emit-word! 3766812992)
|
|
(emit-word! (#3%+ 3766747136 r)))))
|
|
(syntax-case x ()
|
|
[(set! test
|
|
(lambda (r1)
|
|
(ew1! 2953052161)
|
|
(ew2! 3766812992)
|
|
(ew3! (#3%+ 3766747136 r2))))
|
|
(eq? #'r1 #'r2)])))
|
|
(let ([x (parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize ; from mwbor talk
|
|
'(let ()
|
|
(import scheme)
|
|
(define opcode-pos 27)
|
|
(define src1-pos 22)
|
|
(define src2-pos 0)
|
|
(define dst-pos 17)
|
|
(define imm-bit (ash 1 16))
|
|
(define regops '((ld . 22) (add . 28)))
|
|
(define immops '((addi . 28)))
|
|
(define regcodes
|
|
'((r0 . 0) (r1 . 1) (r2 . 2) (r3 . 3)))
|
|
(define-syntax reg
|
|
(syntax-rules ()
|
|
[(_ r) (cdr (assq 'r regcodes))]))
|
|
(define imm
|
|
(lambda (n)
|
|
(unless (< -32768 n 32767)
|
|
(errorf 'imm "invalid immediate ~s" n))
|
|
n))
|
|
(define $emit!
|
|
(lambda (op a1 a2 a3)
|
|
(emit-word!
|
|
(+ (cond
|
|
[(assq op regops) =>
|
|
(lambda (a)
|
|
(ash (cdr a) opcode-pos))]
|
|
[(assq op immops) =>
|
|
(lambda (a)
|
|
(+ (ash (cdr a) opcode-pos)
|
|
imm-bit))]
|
|
[else
|
|
(errorf 'emit
|
|
"unrecognized operator ~s"
|
|
op)])
|
|
(ash a1 src1-pos)
|
|
(ash a2 src2-pos)
|
|
(ash a3 dst-pos)))))
|
|
(define-syntax emit
|
|
(syntax-rules ()
|
|
[(_ op a1 a2 a3) ($emit! 'op a1 a2 a3)]))
|
|
(set! test
|
|
(lambda (r)
|
|
(emit ld (reg r0) (reg r1) (reg r2))
|
|
(emit addi (reg r2) 320 (reg r2))
|
|
(emit add (reg r2) r (reg r2)))))))])
|
|
(and
|
|
(equivalent-expansion? x
|
|
'(set! test
|
|
(lambda (r)
|
|
(emit-word! 2953052161)
|
|
(emit-word! 3766812992)
|
|
(emit-word! (#2%+ 3766747136 (#2%ash r 0))))))
|
|
(syntax-case x ($primitive)
|
|
[(set! test
|
|
(lambda (r1)
|
|
(ew1! 2953052161)
|
|
(ew2! 3766812992)
|
|
(ew3! (#2%+ 3766747136 (#2%ash r2 0)))))
|
|
(eq? #'r1 #'r2)])))
|
|
; verify optimization of (if e s s) => (begin e s)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(lambda (x) (if e x x))))
|
|
'(lambda (x) e x))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(lambda (y x) (if y x x))))
|
|
'(lambda (y x) x))
|
|
; verify optimization of (if s s #f) => s
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(lambda (x) (if x x #f))))
|
|
'(lambda (x) x))
|
|
; verify optimization of (if s s #f) => s
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(let ()
|
|
(define-syntax broken-or
|
|
(syntax-rules ()
|
|
[(_) #f]
|
|
[(_ x y ...)
|
|
(let ([t x])
|
|
(if t t (broken-or y ...)))]))
|
|
(broken-or a))))
|
|
'a)
|
|
; verify optimization of or pattern
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(lambda (x y) (if (not (or (fx< x y) (fx> y x))) x y))))
|
|
'(lambda (x.0 y.1)
|
|
(if (if (#2%fx< x.0 y.1) #t (#2%fx> y.1 x.0))
|
|
y.1
|
|
x.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(lambda (x y) (if (or (fx< x y) (fx> y x)) x y))))
|
|
'(lambda (x y) (if (if (#2%fx< x y) #t (#2%fx> y x)) x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(let ([q #f])
|
|
(lambda (x y) (if (or q (fx> x y)) x y)))))
|
|
'(lambda (x y) (if (#2%fx> x y) x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(let ([q #t])
|
|
(lambda (x y) (if (or q (fx> x y)) x y)))))
|
|
'(lambda (x y) x))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(begin 3 4)))
|
|
4)
|
|
; verify expansion of not pattern
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(not #t)))
|
|
#f)
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(not #f)))
|
|
#t)
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(not '(a b c))))
|
|
#f)
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(let ([x 2] [y 3])
|
|
(not (begin (set! x (* x y)) (set! y (* x y)) 10)))))
|
|
`(let ([x 2] [y 3])
|
|
(set! x (#2%* x y))
|
|
(set! y (#2%* x y))
|
|
#f))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(not (let ([x 2] [y 3]) (set! x (* x y)) (set! y (* x y)) 10))))
|
|
`(let ([x 2])
|
|
(let ([y 3])
|
|
(set! x (#2%* x y))
|
|
(set! y (#2%* x y))
|
|
#f)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
`(if (not (or #t (futz))) 17 32)))
|
|
32)
|
|
)
|
|
|
|
(mat expand-output
|
|
(error? ; not a textual output port or #f
|
|
(expand-output #t))
|
|
(error? ; not a textual output port or #f
|
|
(let-values ([(bop get) (open-bytevector-output-port)])
|
|
(expand-output bop)))
|
|
(begin
|
|
(define $eospam 17)
|
|
#t)
|
|
(equal?
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand-output (current-output-port)] [#%$suppress-primitive-inlining #f])
|
|
(pretty-print (compile '(let () (import (chezscheme)) (+ 3 4 $eospam)))))))
|
|
(if (eqv? (optimize-level) 3)
|
|
"(#3%+ 3 4 $eospam)\n24\n"
|
|
"(#2%+ 3 4 $eospam)\n24\n"))
|
|
(equal?
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand-output (current-output-port)] [#%$suppress-primitive-inlining #f])
|
|
(pretty-print (interpret '(let () (import (chezscheme)) (+ 3 4 $eospam)))))))
|
|
(if (eqv? (optimize-level) 3)
|
|
"(#3%+ 3 4 $eospam)\n24\n"
|
|
"(#2%+ 3 4 $eospam)\n24\n"))
|
|
(begin
|
|
(with-output-to-file "testfile.ss"
|
|
(lambda ()
|
|
(pretty-print '(eval-when (visit revisit) (define $eo-q (* 2 2))))
|
|
(pretty-print '(define $eo-x 3))
|
|
(pretty-print '(define-syntax $eo-a (identifier-syntax 5)))
|
|
(pretty-print '(pretty-print (vector $eo-x $eo-q (+ $eo-a 1)))))
|
|
'replace)
|
|
#t)
|
|
(begin
|
|
(define $eo-sop
|
|
(let ()
|
|
(define syntax-record-writer
|
|
(case-lambda
|
|
[() (record-writer (record-rtd #'a))]
|
|
[(x) (record-writer (record-rtd #'a) x)]))
|
|
(open-input-string
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand-output (current-output-port)]
|
|
[print-gensym #t]
|
|
[optimize-level 2]
|
|
[compile-file-message #f]
|
|
[enable-cp0 #t]
|
|
[#%$suppress-primitive-inlining #f]
|
|
[syntax-record-writer (lambda (x p wr) (display "syntax-object" p))])
|
|
(compile-file "testfile")))))))
|
|
#t)
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(begin
|
|
(set! $eo-q (#2%* 2 2))
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
'(global . ,gensym?)
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (revisit)
|
|
(set! $eo-x 3))
|
|
(eval-when (visit)
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
'(global . ,gensym?)
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (visit)
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
,list?
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (revisit)
|
|
(#2%pretty-print (#2%vector $eo-x $eo-q (#2%+ 5 1))))))
|
|
(begin (set! $eo-sop #f) #t)
|
|
)
|
|
|
|
(mat expand/optimize-output
|
|
(error? ; not a textual output port or #f
|
|
(expand/optimize-output #t))
|
|
(error? ; not a textual output port or #f
|
|
(let-values ([(bop get) (open-bytevector-output-port)])
|
|
(expand/optimize-output bop)))
|
|
(equal?
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand/optimize-output (current-output-port)]
|
|
[enable-cp0 #t]
|
|
[#%$suppress-primitive-inlining #f])
|
|
(pretty-print (compile '(let () (import (chezscheme)) (+ 3 4 $eospam)))))))
|
|
(if (eqv? (optimize-level) 3)
|
|
"(#3%+ 7 $eospam)\n24\n"
|
|
"(#2%+ 7 $eospam)\n24\n"))
|
|
(equal?
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand/optimize-output (current-output-port)]
|
|
[enable-cp0 #t]
|
|
[#%$suppress-primitive-inlining #f])
|
|
(pretty-print (interpret '(let () (import (chezscheme)) (+ 3 4 $eospam)))))))
|
|
(if (eqv? (optimize-level) 3)
|
|
"(#3%+ 7 $eospam)\n24\n"
|
|
"(#2%+ 7 $eospam)\n24\n"))
|
|
(begin
|
|
(with-output-to-file "testfile.ss"
|
|
(lambda ()
|
|
(pretty-print '(eval-when (visit revisit) (define $eo-q (* 2 2))))
|
|
(pretty-print '(define $eo-x 3))
|
|
(pretty-print '(define-syntax $eo-a (identifier-syntax 5)))
|
|
(pretty-print '(pretty-print (vector $eo-x $eo-q (+ $eo-a 1)))))
|
|
'replace)
|
|
#t)
|
|
(begin
|
|
(define $eo-sop
|
|
(let ()
|
|
(define syntax-record-writer
|
|
(case-lambda
|
|
[() (record-writer (record-rtd #'a))]
|
|
[(x) (record-writer (record-rtd #'a) x)]))
|
|
(open-input-string
|
|
(with-output-to-string
|
|
(lambda ()
|
|
(parameterize ([expand/optimize-output (current-output-port)]
|
|
[print-gensym #t]
|
|
[optimize-level 2]
|
|
[compile-file-message #f]
|
|
[enable-cp0 #t]
|
|
[#%$suppress-primitive-inlining #f]
|
|
[syntax-record-writer (lambda (x p wr) (display "syntax-object" p))])
|
|
(compile-file "testfile")))))))
|
|
#t)
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(begin
|
|
(set! $eo-q 4)
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
'(global . ,gensym?)
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (revisit)
|
|
(set! $eo-x 3))
|
|
(eval-when (visit)
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
'(global . ,gensym?)
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (visit)
|
|
(#3%$sc-put-cte
|
|
'syntax-object
|
|
,list?
|
|
'*top*))))
|
|
(equivalent-expansion?
|
|
(read $eo-sop)
|
|
`(begin
|
|
(recompile-requirements () ())
|
|
(eval-when (revisit)
|
|
(#2%pretty-print (#2%vector $eo-x $eo-q 6)))))
|
|
(begin (set! $eo-sop #f) #t)
|
|
)
|
|
|
|
(mat cp0-partial-folding
|
|
; check partial folding of +, fx+, fl+, and cfl+
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(+) (+ 3) (+ 3 4) (+ x) (+ x 0) (+ 0 x) (+ x 3)
|
|
(+ x 3 4) (+ 3 x 4) (+ 3 x -3) (+ 3 x 4 y 5)
|
|
(+ +nan.0 x 4 y 5))))
|
|
'(#2%list 0 3 7 (#2%+ x) (#2%+ x) (#2%+ x) (#2%+ 3 x)
|
|
(#2%+ 7 x) (#2%+ 7 x) (#2%+ x) (#2%+ 12 x y)
|
|
(begin (#2%+ x y) +nan.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(+) (+ 3) (+ 3 4) (+ x) (+ x 0) (+ 0 x) (+ x 3)
|
|
(+ x 3 4) (+ 3 x 4) (+ 3 x -3) (+ 3 x 4 y 5)
|
|
(+ +nan.0 x 4 y 5))))
|
|
'(#3%list 0 3 7 x x x (#3%+ 3 x)
|
|
(#3%+ 7 x) (#3%+ 7 x) x (#3%+ 12 x y)
|
|
+nan.0))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fx+) (fx+ 3) (fx+ 3 4) (fx+ x) (fx+ x 0) (fx+ 0 x) (fx+ x 3)
|
|
(fx+ x 3 4) (fx+ 3 x 4) (fx+ 3 x -3) (fx+ 3 x 4 y 5))))
|
|
'(#2%list 0 3 7 (#2%fx+ x) (#2%fx+ x) (#2%fx+ x) (#2%fx+ 3 x)
|
|
(#2%fx+ 7 x) (#2%fx+ 7 x) (#2%fx+ x) (#2%fx+ 12 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fx+) (fx+ 3) (fx+ 3 4) (fx+ x) (fx+ x 0) (fx+ 0 x) (fx+ x 3)
|
|
(fx+ x 3 4) (fx+ 3 x 4) (fx+ 3 x -3) (fx+ 3 x 4 y 5))))
|
|
'(#3%list 0 3 7 x x x (#3%fx+ 3 x)
|
|
(#3%fx+ 7 x) (#3%fx+ 7 x) x (#3%fx+ 12 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fl+) (fl+ 3.0) (fl+ 3.0 4.0) (fl+ x) (fl+ x 0.0) (fl+ x -0.0) (fl+ 0.0 x) (fl+ -0.0 x) (fl+ x 3.0)
|
|
(fl+ x 3.0 4.0) (fl+ 3.0 x 4.0) (fl+ 3.0 x -3.0) (fl+ (truncate -.5) x (/ -inf.0)) (fl+ 3.0 x 4.0 y 5.0)
|
|
(fl+ 3.0 x +nan.0 y 5.0))))
|
|
'(#2%list 0.0 3.0 7.0 (#2%fl+ x) (#2%fl+ 0.0 x) (#2%fl+ x) (#2%fl+ 0.0 x) (#2%fl+ x) (#2%fl+ 3.0 x)
|
|
(#2%fl+ 7.0 x) (#2%fl+ 7.0 x) (#2%fl+ 0.0 x) (#2%fl+ x) (#2%fl+ 12.0 x y)
|
|
(begin (#2%fl+ x y) +nan.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fl+) (fl+ 3.0) (fl+ 3.0 4.0) (fl+ x) (fl+ x 0.0) (fl+ x -0.0) (fl+ 0.0 x) (fl+ -0.0 x) (fl+ x 3.0)
|
|
(fl+ x 3.0 4.0) (fl+ 3.0 x 4.0) (fl+ 3.0 x -3.0) (fl+ (truncate -.5) x (/ -inf.0)) (fl+ 3.0 x 4.0 y 5.0)
|
|
(fl+ 3.0 x +nan.0 y 5.0))))
|
|
'(#3%list 0.0 3.0 7.0 x (#3%fl+ 0.0 x) x (#3%fl+ 0.0 x) x (#3%fl+ 3.0 x)
|
|
(#3%fl+ 7.0 x) (#3%fl+ 7.0 x) (#3%fl+ 0.0 x) x (#3%fl+ 12.0 x y)
|
|
+nan.0))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl+) (cfl+ 3.0) (cfl+ 3.0 4.0) (cfl+ x) (cfl+ x 0.0) (cfl+ x -0.0) (cfl+ 0.0 x) (cfl+ -0.0 x) (cfl+ x 3.0)
|
|
(cfl+ x 3.0 4.0) (cfl+ 3.0 x 4.0) (cfl+ 3.0 x -3.0) (cfl+ (truncate -.5) x (/ -inf.0)) (cfl+ 3.0 x 4.0 y 5.0)
|
|
(cfl+ 3.0 x +nan.0+nan.0i y 5.0))))
|
|
'(#2%list 0.0 3.0 7.0 (#2%cfl+ x) (#2%cfl+ 0.0 x) (#2%cfl+ x) (#2%cfl+ 0.0 x) (#2%cfl+ x) (#2%cfl+ 3.0 x)
|
|
(#2%cfl+ 7.0 x) (#2%cfl+ 7.0 x) (#2%cfl+ 0.0 x) (#2%cfl+ x) (#2%cfl+ 12.0 x y)
|
|
(begin (#2%cfl+ x y) +nan.0+nan.0i)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl+) (cfl+ 3.0) (cfl+ 3.0 4.0) (cfl+ x) (cfl+ x 0.0) (cfl+ x -0.0) (cfl+ 0.0 x) (cfl+ -0.0 x) (cfl+ x 3.0)
|
|
(cfl+ x 3.0 4.0) (cfl+ 3.0 x 4.0) (cfl+ 3.0 x -3.0) (cfl+ (truncate -.5) x (/ -inf.0)) (cfl+ 3.0 x 4.0 y 5.0)
|
|
(cfl+ 3.0 x +nan.0+nan.0i y 5.0))))
|
|
'(#3%list 0.0 3.0 7.0 x (#3%cfl+ 0.0 x) x (#3%cfl+ 0.0 x) x (#3%cfl+ 3.0 x)
|
|
(#3%cfl+ 7.0 x) (#3%cfl+ 7.0 x) (#3%cfl+ 0.0 x) x (#3%cfl+ 12.0 x y)
|
|
+nan.0+nan.0i))
|
|
|
|
; check partial folding of *, fx*, fl*, and cfl*
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(*) (* 3) (* 3 4) (* x) (* x 1) (* 1 x) (* x 3)
|
|
(* x 3 4) (* 3 x 4) (* 3 x 1/3) (* 3 x 4 y 5)
|
|
(* 3 x 0 y 5))))
|
|
'(#2%list 1 3 12 (#2%* x) (#2%* x) (#2%* x) (#2%* 3 x)
|
|
(#2%* 12 x) (#2%* 12 x) (#2%* x) (#2%* 60 x y)
|
|
(begin (#2%* x y) 0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(*) (* 3) (* 3 4) (* x) (* x 1) (* 1 x) (* x 3)
|
|
(* x 3 4) (* 3 x 4) (* 3 x 1/3) (* 3 x 4 y 5)
|
|
(* 3 x 0 y 5))))
|
|
'(#3%list 1 3 12 x x x (#3%* 3 x)
|
|
(#3%* 12 x) (#3%* 12 x) x (#3%* 60 x y)
|
|
0))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fx*) (fx* 3) (fx* 3 4) (fx* x) (fx* x 1) (fx* 1 x) (fx* x 3)
|
|
(fx* x 3 4) (fx* 3 x 4) (fx* 1 x 1) (fx* 3 x 4 y 5)
|
|
(fx* 3 x 0 y 5))))
|
|
'(#2%list 1 3 12 (#2%fx* x) (#2%fx* x) (#2%fx* x) (#2%fx* 3 x)
|
|
(#2%fx* 12 x) (#2%fx* 12 x) (#2%fx* x) (#2%fx* 60 x y)
|
|
(begin (#2%fx* x y) 0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fx*) (fx* 3) (fx* 3 4) (fx* x) (fx* x 1) (fx* 1 x) (fx* x 3)
|
|
(fx* x 3 4) (fx* 3 x 4) (fx* 1 x 1) (fx* 3 x 4 y 5)
|
|
(fx* 3 x 0 y 5))))
|
|
'(#3%list 1 3 12 x x x (#3%fx* 3 x)
|
|
(#3%fx* 12 x) (#3%fx* 12 x) x (#3%fx* 60 x y)
|
|
0))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fl*) (fl* 3.0) (fl* 3.0 4.0) (fl* x) (fl* x 1.0) (fl* 1.0 x) (fl* x 3.0)
|
|
(fl* x 3.0 4.0) (fl* 3.0 x 4.0) (fl* 3.0 x #i1/3) (fl* 3.0 x 4.0 y 5.0)
|
|
(fl* 3.0 x 4.0 y +nan.0))))
|
|
'(#2%list 1.0 3.0 12.0 (#2%fl* x) (#2%fl* x) (#2%fl* x) (#2%fl* 3.0 x)
|
|
(#2%fl* 12.0 x) (#2%fl* 12.0 x) (#2%fl* x) (#2%fl* 60.0 x y)
|
|
(begin (#2%fl* x y) +nan.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fl*) (fl* 3.0) (fl* 3.0 4.0) (fl* x) (fl* x 1.0) (fl* 1.0 x) (fl* x 3.0)
|
|
(fl* x 3.0 4.0) (fl* 3.0 x 4.0) (fl* 3.0 x #i1/3) (fl* 3.0 x 4.0 y 5.0)
|
|
(fl* 3.0 x 4.0 y +nan.0))))
|
|
'(#3%list 1.0 3.0 12.0 x x x (#3%fl* 3.0 x)
|
|
(#3%fl* 12.0 x) (#3%fl* 12.0 x) x (#3%fl* 60.0 x y)
|
|
+nan.0))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl*) (cfl* 3.0) (cfl* 3.0 4.0) (cfl* x) (cfl* x 1.0) (cfl* 1.0 x) (cfl* x 3.0)
|
|
(cfl* x 3.0 4.0) (cfl* 3.0 x 4.0) (cfl* 3.0 x #i1/3) (cfl* 3.0 x 4.0 y 5.0)
|
|
(cfl* 3.0 x 4.0 y +nan.0+nan.0i))))
|
|
'(#2%list 1.0 3.0 12.0 (#2%cfl* x) (#2%cfl* x) (#2%cfl* x) (#2%cfl* 3.0 x)
|
|
(#2%cfl* 12.0 x) (#2%cfl* 12.0 x) (#2%cfl* x) (#2%cfl* 60.0 x y)
|
|
(begin (#2%cfl* x y) +nan.0+nan.0i)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl*) (cfl* 3.0) (cfl* 3.0 4.0) (cfl* x) (cfl* x 1.0) (cfl* 1.0 x) (cfl* x 3.0)
|
|
(cfl* x 3.0 4.0) (cfl* 3.0 x 4.0) (cfl* 3.0 x #i1/3) (cfl* 3.0 x 4.0 y 5.0)
|
|
(cfl* 3.0 x 4.0 y +nan.0+nan.0i))))
|
|
'(#3%list 1.0 3.0 12.0 x x x (#3%cfl* 3.0 x)
|
|
(#3%cfl* 12.0 x) (#3%cfl* 12.0 x) x (#3%cfl* 60.0 x y)
|
|
+nan.0+nan.0i))
|
|
|
|
; check partial folding of -, fx-, fl-, and cfl-
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(- 3) (- 3 4) (- x) (- x 0) (- 0 x) (- x 3) (- x 3 4)
|
|
(- 3 x 4) (- 3 x 3) (- x 3 -3) (- 4 x 3 -3) (- 3 x 4 y 5))))
|
|
'(#2%list -3 -1 (#2%- x) (#2%- x 0) (#2%- x) (#2%- x 3) (#2%- x 3 4) (#2%- 3 x 4)
|
|
(#2%- 3 x 3) (#2%- x 3 -3) (#2%- 4 x 3 -3) (#2%- 3 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(- 3) (- 3 4) (- x) (- x 0) (- 0 x) (- x 3) (- x 3 4)
|
|
(- 3 x 4) (- 3 x 3) (- x 3 -3) (- 4 x 3 -3) (- 3 x 4 y 5))))
|
|
'(#3%list -3 -1 (#3%- x) (#3%- x 0) (#3%- x) (#3%- x 3) (#3%- x 3 4) (#3%- 3 x 4)
|
|
(#3%- 3 x 3) (#3%- x 3 -3) (#3%- 4 x 3 -3) (#3%- 3 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fx- 3) (fx- 3 4) (fx- x) (fx- x 0) (fx- 0 x) (fx- x 3) (fx- x 3 4)
|
|
(fx- 3 x 4) (fx- 3 x 3) (fx- x 3 -3) (fx- 4 x 3 -3) (fx- 3 x 4 y 5))))
|
|
'(#2%list -3 -1 (#2%fx- x) (#2%fx- x 0) (#2%fx- x) (#2%fx- x 3) (#2%fx- x 3 4) (#2%fx- 3 x 4)
|
|
(#2%fx- 3 x 3) (#2%fx- x 3 -3) (#2%fx- 4 x 3 -3) (#2%fx- 3 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fx- 3) (fx- 3 4) (fx- x) (fx- x 0) (fx- 0 x) (fx- x 3) (fx- x 3 4)
|
|
(fx- 3 x 4) (fx- 3 x 3) (fx- x 3 -3) (fx- 4 x 3 -3) (fx- 3 x 4 y 5))))
|
|
'(#3%list -3 -1 (#3%fx- x) (#3%fx- x 0) (#3%fx- x) (#3%fx- x 3) (#3%fx- x 3 4) (#3%fx- 3 x 4)
|
|
(#3%fx- 3 x 3) (#3%fx- x 3 -3) (#3%fx- 4 x 3 -3) (#3%fx- 3 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fl- 3.0) (fl- 3.0 4.0) (fl- x) (fl- x 0.0) (fl- x -0.0) (fl- 0.0 x) (fl- -0.0 x) (fl- x 3.0) (fl- x 3.0 4.0)
|
|
(fl- 3.0 x 4.0) (fl- 3.0 x 3.0) (fl- -0.0 x 0.0) (fl- x 3.0 -3.0) (fl- x 0.0 y) (fl- x -0.0 3.0) (fl- 4.0 x 3.0 -3.0)
|
|
(fl- 3.0 x 4.0 y 5.0))))
|
|
'(#2%list -3.0 -1.0 (#2%fl- x) (#2%fl- x 0.0) (#2%fl- x -0.0) (#2%fl- 0.0 x) (#2%fl- x) (#2%fl- x 3.0)
|
|
(#2%fl- x 3.0 4.0) (#2%fl- 3.0 x 4.0) (#2%fl- 3.0 x 3.0) (#2%fl- -0.0 x 0.0) (#2%fl- x 3.0 -3.0)
|
|
(#2%fl- x 0.0 y) (#2%fl- x -0.0 3.0) (#2%fl- 4.0 x 3.0 -3.0) (#2%fl- 3.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fl- 3.0) (fl- 3.0 4.0) (fl- x) (fl- x 0.0) (fl- x -0.0) (fl- 0.0 x) (fl- -0.0 x) (fl- x 3.0) (fl- x 3.0 4.0)
|
|
(fl- 3.0 x 4.0) (fl- 3.0 x 3.0) (fl- -0.0 x 0.0) (fl- x 3.0 -3.0) (fl- x 0.0 y) (fl- x -0.0 3.0) (fl- 4.0 x 3.0 -3.0)
|
|
(fl- 3.0 x 4.0 y 5.0))))
|
|
'(#3%list -3.0 -1.0 (#3%fl- x) (#3%fl- x 0.0) (#3%fl- x -0.0) (#3%fl- 0.0 x) (#3%fl- x) (#3%fl- x 3.0)
|
|
(#3%fl- x 3.0 4.0) (#3%fl- 3.0 x 4.0) (#3%fl- 3.0 x 3.0) (#3%fl- -0.0 x 0.0) (#3%fl- x 3.0 -3.0)
|
|
(#3%fl- x 0.0 y) (#3%fl- x -0.0 3.0) (#3%fl- 4.0 x 3.0 -3.0) (#3%fl- 3.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl- 3.0) (cfl- 3.0 4.0) (cfl- x) (cfl- x 0.0) (cfl- x -0.0) (cfl- 0.0 x) (cfl- -0.0 x) (cfl- x 3.0) (cfl- x 3.0 4.0)
|
|
(cfl- 3.0 x 4.0) (cfl- 3.0 x 3.0) (cfl- -0.0 x 0.0) (cfl- x 3.0 -3.0) (cfl- x 0.0 y) (cfl- x -0.0 3.0) (cfl- 4.0 x 3.0 -3.0)
|
|
(cfl- 3.0 x 4.0 y 5.0))))
|
|
'(#2%list
|
|
-3.0 -1.0 (#2%cfl- x) (#2%cfl- x 0.0) (#2%cfl- x -0.0) (#2%cfl- 0.0 x) (#2%cfl- x) (#2%cfl- x 3.0) (#2%cfl- x 3.0 4.0)
|
|
(#2%cfl- 3.0 x 4.0) (#2%cfl- 3.0 x 3.0) (#2%cfl- -0.0 x 0.0) (#2%cfl- x 3.0 -3.0) (#2%cfl- x 0.0 y) (#2%cfl- x -0.0 3.0) (#2%cfl- 4.0 x 3.0 -3.0)
|
|
(#2%cfl- 3.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl- 3.0) (cfl- 3.0 4.0) (cfl- x) (cfl- x 0.0) (cfl- x -0.0) (cfl- 0.0 x) (cfl- -0.0 x) (cfl- x 3.0) (cfl- x 3.0 4.0)
|
|
(cfl- 3.0 x 4.0) (cfl- 3.0 x 3.0) (cfl- -0.0 x 0.0) (cfl- x 3.0 -3.0) (cfl- x 0.0 y) (cfl- x -0.0 3.0) (cfl- 4.0 x 3.0 -3.0)
|
|
(cfl- 3.0 x 4.0 y 5.0))))
|
|
'(#3%list
|
|
-3.0 -1.0 (#3%cfl- x) (#3%cfl- x 0.0) (#3%cfl- x -0.0) (#3%cfl- 0.0 x) (#3%cfl- x) (#3%cfl- x 3.0) (#3%cfl- x 3.0 4.0)
|
|
(#3%cfl- 3.0 x 4.0) (#3%cfl- 3.0 x 3.0) (#3%cfl- -0.0 x 0.0) (#3%cfl- x 3.0 -3.0) (#3%cfl- x 0.0 y) (#3%cfl- x -0.0 3.0) (#3%cfl- 4.0 x 3.0 -3.0)
|
|
(#3%cfl- 3.0 x 4.0 y 5.0)))
|
|
|
|
; check partial folding of /, fx/, fl/, and cfl/
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(/ 3) (/ 9 4) (/ x) (/ x 1) (/ 1 x) (/ x 3) (/ x 3 4)
|
|
(/ 9 x 4) (/ 3 x 3) (/ x 3 1/3) (/ 4 x 3 1/3) (/ 50 x 4 y 5))))
|
|
'(#2%list
|
|
1/3 9/4 (#2%/ x) (#2%/ x 1) (#2%/ x) (#2%/ x 3) (#2%/ x 3 4)
|
|
(#2%/ 9 x 4) (#2%/ 3 x 3) (#2%/ x 3 1/3) (#2%/ 4 x 3 1/3) (#2%/ 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(/ 3) (/ 9 4) (/ x) (/ x 1) (/ 1 x) (/ x 3) (/ x 3 4)
|
|
(/ 9 x 4) (/ 3 x 3) (/ x 3 1/3) (/ 4 x 3 1/3) (/ 50 x 4 y 5))))
|
|
'(#3%list
|
|
1/3 9/4 (#3%/ x) (#3%/ x 1) (#3%/ x) (#3%/ x 3) (#3%/ x 3 4)
|
|
(#3%/ 9 x 4) (#3%/ 3 x 3) (#3%/ x 3 1/3) (#3%/ 4 x 3 1/3) (#3%/ 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fx/ 3) (fx/ 9 4) (fx/ x) (fx/ x 1) (fx/ 1 x) (fx/ x 3) (fx/ x 3 4)
|
|
(fx/ 9 x 4) (fx/ 1 x 1) (fx/ x 1 1) (fx/ 4 x 1 1) (fx/ 50 x 4 y 5))))
|
|
'(#2%list
|
|
0 2 (#2%fx/ x) (#2%fx/ x 1) (#2%fx/ x) (#2%fx/ x 3) (#2%fx/ x 3 4)
|
|
(#2%fx/ 9 x 4) (#2%fx/ 1 x 1) (#2%fx/ x 1 1) (#2%fx/ 4 x 1 1) (#2%fx/ 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fx/ 3) (fx/ 9 4) (fx/ x) (fx/ x 1) (fx/ 1 x) (fx/ x 3) (fx/ x 3 4)
|
|
(fx/ 9 x 4) (fx/ 1 x 1) (fx/ x 1 1) (fx/ 4 x 1 1) (fx/ 50 x 4 y 5))))
|
|
'(#3%list
|
|
0 2 (#3%fx/ x) (#3%fx/ x 1) (#3%fx/ x) (#3%fx/ x 3) (#3%fx/ x 3 4)
|
|
(#3%fx/ 9 x 4) (#3%fx/ 1 x 1) (#3%fx/ x 1 1) (#3%fx/ 4 x 1 1) (#3%fx/ 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fxquotient 3) (fxquotient 9 4) (fxquotient x) (fxquotient x 1) (fxquotient 1 x) (fxquotient x 3) (fxquotient x 3 4)
|
|
(fxquotient 9 x 4) (fxquotient 1 x 1) (fxquotient x 1 1) (fxquotient 4 x 1 1) (fxquotient 50 x 4 y 5))))
|
|
'(#2%list
|
|
0 2 (#2%fxquotient x) (#2%fxquotient x 1) (#2%fxquotient x) (#2%fxquotient x 3) (#2%fxquotient x 3 4)
|
|
(#2%fxquotient 9 x 4) (#2%fxquotient 1 x 1) (#2%fxquotient x 1 1) (#2%fxquotient 4 x 1 1) (#2%fxquotient 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fxquotient 3) (fxquotient 9 4) (fxquotient x) (fxquotient x 1) (fxquotient 1 x) (fxquotient x 3) (fxquotient x 3 4)
|
|
(fxquotient 9 x 4) (fxquotient 1 x 1) (fxquotient x 1 1) (fxquotient 4 x 1 1) (fxquotient 50 x 4 y 5))))
|
|
'(#3%list
|
|
0 2 (#3%fxquotient x) (#3%fxquotient x 1) (#3%fxquotient x) (#3%fxquotient x 3) (#3%fxquotient x 3 4)
|
|
(#3%fxquotient 9 x 4) (#3%fxquotient 1 x 1) (#3%fxquotient x 1 1) (#3%fxquotient 4 x 1 1) (#3%fxquotient 50 x 4 y 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fl/ 2.0) (fl/ 9.0 4.0) (fl/ x) (fl/ x 1.0) (fl/ 1.0 x) (fl/ x 3.0) (fl/ x 3.0 4.0)
|
|
(fl/ 9.0 x 4.0) (fl/ 3.0 x 3.0) (fl/ x 2.0 .5) (fl/ 4.0 x 2.0 .5)
|
|
(fl/ 50.0 x 4.0 y 5.0))))
|
|
'(#2%list
|
|
.5 2.25 (#2%fl/ x) (#2%fl/ x 1.0) (#2%fl/ x) (#2%fl/ x 3.0) (#2%fl/ x 3.0 4.0)
|
|
(#2%fl/ 9.0 x 4.0) (#2%fl/ 3.0 x 3.0) (#2%fl/ x 2.0 .5) (#2%fl/ 4.0 x 2.0 .5)
|
|
(#2%fl/ 50.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fl/ 2.0) (fl/ 9.0 4.0) (fl/ x) (fl/ x 1.0) (fl/ 1.0 x) (fl/ x 3.0) (fl/ x 3.0 4.0)
|
|
(fl/ 9.0 x 4.0) (fl/ 3.0 x 3.0) (fl/ x 2.0 .5) (fl/ 4.0 x 2.0 .5)
|
|
(fl/ 50.0 x 4.0 y 5.0))))
|
|
'(#3%list
|
|
.5 2.25 (#3%fl/ x) (#3%fl/ x 1.0) (#3%fl/ x) (#3%fl/ x 3.0) (#3%fl/ x 3.0 4.0)
|
|
(#3%fl/ 9.0 x 4.0) (#3%fl/ 3.0 x 3.0) (#3%fl/ x 2.0 .5) (#3%fl/ 4.0 x 2.0 .5)
|
|
(#3%fl/ 50.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl/ 2.0) (cfl/ 9.0 4.0) (cfl/ x) (cfl/ x 1.0) (cfl/ 1.0 x) (cfl/ x 3.0) (cfl/ x 3.0 4.0)
|
|
(cfl/ 9.0 x 4.0) (cfl/ 3.0 x 3.0) (cfl/ x 2.0 .5) (cfl/ 4.0 x 2.0 .5)
|
|
(cfl/ 50.0 x 4.0 y 5.0))))
|
|
'(#2%list
|
|
.5 2.25 (#2%cfl/ x) (#2%cfl/ x 1.0) (#2%cfl/ x) (#2%cfl/ x 3.0) (#2%cfl/ x 3.0 4.0)
|
|
(#2%cfl/ 9.0 x 4.0) (#2%cfl/ 3.0 x 3.0) (#2%cfl/ x 2.0 .5) (#2%cfl/ 4.0 x 2.0 .5)
|
|
(#2%cfl/ 50.0 x 4.0 y 5.0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(cfl/ 2.0) (cfl/ 9.0 4.0) (cfl/ x) (cfl/ x 1.0) (cfl/ 1.0 x) (cfl/ x 3.0) (cfl/ x 3.0 4.0)
|
|
(cfl/ 9.0 x 4.0) (cfl/ 3.0 x 3.0) (cfl/ x 2.0 .5) (cfl/ 4.0 x 2.0 .5)
|
|
(cfl/ 50.0 x 4.0 y 5.0))))
|
|
'(#3%list
|
|
.5 2.25 (#3%cfl/ x) (#3%cfl/ x 1.0) (#3%cfl/ x) (#3%cfl/ x 3.0) (#3%cfl/ x 3.0 4.0)
|
|
(#3%cfl/ 9.0 x 4.0) (#3%cfl/ 3.0 x 3.0) (#3%cfl/ x 2.0 .5) (#3%cfl/ 4.0 x 2.0 .5)
|
|
(#3%cfl/ 50.0 x 4.0 y 5.0)))
|
|
|
|
; check partial folding of #{2,3}%{fx,}log{and,or,xor}
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(logand)
|
|
(logand -1) (logand 0) (logand 7)
|
|
(logand 5 0) (logand 0 5) (logand 5 -1) (logand -1 x) (logand x 0) (logand 5 3) (logand 5 x) (logand x y)
|
|
(logand 5 0 3) (logand 5 7 -1 6) (logand x -1 y) (logand 13 x 7 y) (logand 13 x 7 0 y) (logand 13 x 7 -1 y))))
|
|
'(#2%list
|
|
-1
|
|
-1 0 7
|
|
0 0 5 (#2%logand x) (begin (#2%logand x) 0) 1 (#2%logand 5 x) (#2%logand x y)
|
|
0 4 (#2%logand x y) (#2%logand 5 x y) (begin (#2%logand x y) 0) (#2%logand 5 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(logand)
|
|
(logand -1) (logand 0) (logand 7)
|
|
(logand 5 0) (logand 0 5) (logand 5 -1) (logand -1 x) (logand x 0) (logand 5 3) (logand 5 x) (logand x y)
|
|
(logand 5 0 3) (logand 5 7 -1 6) (logand x -1 y) (logand 13 x 7 y) (logand 13 x 7 0 y) (logand 13 x 7 -1 y))))
|
|
'(#3%list
|
|
-1
|
|
-1 0 7
|
|
0 0 5 x 0 1 (#3%logand 5 x) (#3%logand x y)
|
|
0 4 (#3%logand x y) (#3%logand 5 x y) 0 (#3%logand 5 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogand)
|
|
(fxlogand -1) (fxlogand 0) (fxlogand 7)
|
|
(fxlogand 5 0) (fxlogand 0 5) (fxlogand 5 -1) (fxlogand -1 x) (fxlogand x 0) (fxlogand 5 3) (fxlogand 5 x) (fxlogand x y)
|
|
(fxlogand 5 0 3) (fxlogand 5 7 -1 6) (fxlogand x -1 y) (fxlogand 13 x 7 y) (fxlogand 13 x 7 0 y) (fxlogand 13 x 7 -1 y))))
|
|
'(#2%list
|
|
-1
|
|
-1 0 7
|
|
0 0 5 (#2%fxlogand x) (begin (#2%fxlogand x) 0) 1 (#2%fxlogand 5 x) (#2%fxlogand x y)
|
|
0 4 (#2%fxlogand x y) (#2%fxlogand 5 x y) (begin (#2%fxlogand x y) 0) (#2%fxlogand 5 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogand)
|
|
(fxlogand -1) (fxlogand 0) (fxlogand 7)
|
|
(fxlogand 5 0) (fxlogand 0 5) (fxlogand 5 -1) (fxlogand -1 x) (fxlogand x 0) (fxlogand 5 3) (fxlogand 5 x) (fxlogand x y)
|
|
(fxlogand 5 0 3) (fxlogand 5 7 -1 6) (fxlogand x -1 y) (fxlogand 13 x 7 y) (fxlogand 13 x 7 0 y) (fxlogand 13 x 7 -1 y))))
|
|
'(#3%list
|
|
-1
|
|
-1 0 7
|
|
0 0 5 x 0 1 (#3%fxlogand 5 x) (#3%fxlogand x y)
|
|
0 4 (#3%fxlogand x y) (#3%fxlogand 5 x y) 0 (#3%fxlogand 5 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogor)
|
|
(fxlogor -1) (fxlogor 0) (fxlogor 7)
|
|
(fxlogor 5 0) (fxlogor 0 5) (fxlogor 5 -1) (fxlogor -1 x) (fxlogor x 0) (fxlogor 5 3) (fxlogor 5 x) (fxlogor x y)
|
|
(fxlogor 5 0 3) (fxlogor 5 7 -1 6) (fxlogor x 0 y) (fxlogor 13 x 7 y) (fxlogor 13 x 7 -1 y) (fxlogor 13 x 7 0 y))))
|
|
'(#2%list
|
|
0
|
|
-1 0 7
|
|
5 5 -1 (begin (#2%fxlogor x) -1) (#2%fxlogor x) 7 (#2%fxlogor 5 x) (#2%fxlogor x y)
|
|
7 -1 (#2%fxlogor x y) (#2%fxlogor 15 x y) (begin (#2%fxlogor x y) -1) (#2%fxlogor 15 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogor)
|
|
(fxlogor -1) (fxlogor 0) (fxlogor 7)
|
|
(fxlogor 5 0) (fxlogor 0 5) (fxlogor 5 -1) (fxlogor -1 x) (fxlogor x 0) (fxlogor 5 3) (fxlogor 5 x) (fxlogor x y)
|
|
(fxlogor 5 0 3) (fxlogor 5 7 -1 6) (fxlogor x 0 y) (fxlogor 13 x 7 y) (fxlogor 13 x 7 -1 y) (fxlogor 13 x 7 0 y))))
|
|
'(#3%list
|
|
0
|
|
-1 0 7
|
|
5 5 -1 -1 x 7 (#3%fxlogor 5 x) (#3%fxlogor x y)
|
|
7 -1 (#3%fxlogor x y) (#3%fxlogor 15 x y) -1 (#3%fxlogor 15 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(logor)
|
|
(logor -1) (logor 0) (logor 7)
|
|
(logor 5 0) (logor 0 5) (logor 5 -1) (logor -1 x) (logor x 0) (logor 5 3) (logor 5 x) (logor x y)
|
|
(logor 5 0 3) (logor 5 7 -1 6) (logor x 0 y) (logor 13 x 7 y) (logor 13 x 7 -1 y) (logor 13 x 7 0 y))))
|
|
'(#2%list
|
|
0
|
|
-1 0 7
|
|
5 5 -1 (begin (#2%logor x) -1) (#2%logor x) 7 (#2%logor 5 x) (#2%logor x y)
|
|
7 -1 (#2%logor x y) (#2%logor 15 x y) (begin (#2%logor x y) -1) (#2%logor 15 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(logor)
|
|
(logor -1) (logor 0) (logor 7)
|
|
(logor 5 0) (logor 0 5) (logor 5 -1) (logor -1 x) (logor x 0) (logor 5 3) (logor 5 x) (logor x y)
|
|
(logor 5 0 3) (logor 5 7 -1 6) (logor x 0 y) (logor 13 x 7 y) (logor 13 x 7 -1 y) (logor 13 x 7 0 y))))
|
|
'(#3%list
|
|
0
|
|
-1 0 7
|
|
5 5 -1 -1 x 7 (#3%logor 5 x) (#3%logor x y)
|
|
7 -1 (#3%logor x y) (#3%logor 15 x y) -1 (#3%logor 15 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(logxor)
|
|
(logxor -1) (logxor 0) (logxor 7)
|
|
(logxor 5 0) (logxor 0 5) (logxor 5 -1) (logxor -1 x) (logxor x 0) (logxor 5 3) (logxor 5 x) (logxor x y)
|
|
(logxor 5 0 3) (logxor 5 7 -1 6) (logxor x 0 y) (logxor 13 x 7 y) (logxor 13 x 7 -1 y) (logxor 13 x 7 0 y))))
|
|
'(#2%list
|
|
0
|
|
-1 0 7
|
|
5 5 -6 (#2%logxor -1 x) (#2%logxor x) 6 (#2%logxor 5 x) (#2%logxor x y)
|
|
6 -5 (#2%logxor x y) (#2%logxor 10 x y) (#2%logxor -11 x y) (#2%logxor 10 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(logxor)
|
|
(logxor -1) (logxor 0) (logxor 7)
|
|
(logxor 5 0) (logxor 0 5) (logxor 5 -1) (logxor -1 x) (logxor x 0) (logxor 5 3) (logxor 5 x) (logxor x y)
|
|
(logxor 5 0 3) (logxor 5 7 -1 6) (logxor x 0 y) (logxor 13 x 7 y) (logxor 13 x 7 -1 y) (logxor 13 x 7 0 y))))
|
|
'(#3%list
|
|
0
|
|
-1 0 7
|
|
5 5 -6 (#3%logxor -1 x) x 6 (#3%logxor 5 x) (#3%logxor x y)
|
|
6 -5 (#3%logxor x y) (#3%logxor 10 x y) (#3%logxor -11 x y) (#3%logxor 10 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 2])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogxor)
|
|
(fxlogxor -1) (fxlogxor 0) (fxlogxor 7)
|
|
(fxlogxor 5 0) (fxlogxor 0 5) (fxlogxor 5 -1) (fxlogxor -1 x) (fxlogxor x 0) (fxlogxor 5 3) (fxlogxor 5 x) (fxlogxor x y)
|
|
(fxlogxor 5 0 3) (fxlogxor 5 7 -1 6) (fxlogxor x 0 y) (fxlogxor 13 x 7 y) (fxlogxor 13 x 7 -1 y) (fxlogxor 13 x 7 0 y))))
|
|
'(#2%list
|
|
0
|
|
-1 0 7
|
|
5 5 -6 (#2%fxlogxor -1 x) (#2%fxlogxor x) 6 (#2%fxlogxor 5 x) (#2%fxlogxor x y)
|
|
6 -5 (#2%fxlogxor x y) (#2%fxlogxor 10 x y) (#2%fxlogxor -11 x y) (#2%fxlogxor 10 x y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f]
|
|
[run-cp0 (lambda (cp0 x) (cp0 x))]
|
|
[optimize-level 3])
|
|
(expand/optimize
|
|
'(list
|
|
(fxlogxor)
|
|
(fxlogxor -1) (fxlogxor 0) (fxlogxor 7)
|
|
(fxlogxor 5 0) (fxlogxor 0 5) (fxlogxor 5 -1) (fxlogxor -1 x) (fxlogxor x 0) (fxlogxor 5 3) (fxlogxor 5 x) (fxlogxor x y)
|
|
(fxlogxor 5 0 3) (fxlogxor 5 7 -1 6) (fxlogxor x 0 y) (fxlogxor 13 x 7 y) (fxlogxor 13 x 7 -1 y) (fxlogxor 13 x 7 0 y))))
|
|
'(#3%list
|
|
0
|
|
-1 0 7
|
|
5 5 -6 (#3%fxlogxor -1 x) x 6 (#3%fxlogxor 5 x) (#3%fxlogxor x y)
|
|
6 -5 (#3%fxlogxor x y) (#3%fxlogxor 10 x y) (#3%fxlogxor -11 x y) (#3%fxlogxor 10 x y)))
|
|
)
|
|
|
|
(mat cp0-apply
|
|
(begin
|
|
(define $permutations
|
|
(rec permutations
|
|
(lambda (x*)
|
|
(if (null? x*)
|
|
'()
|
|
(if (null? (cdr x*))
|
|
(list x*)
|
|
(let f ([x* x*] [rx* '()])
|
|
(if (null? x*)
|
|
'()
|
|
(append
|
|
(map (lambda (ls) (cons (car x*) ls)) (permutations (append (cdr x*) rx*)))
|
|
(f (cdr x*) (cons (car x*) rx*))))))))))
|
|
#t)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply (lambda () 7) '())))
|
|
'7)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%+ x y z)) '(3 4 5))))
|
|
'12)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%+ x y z)) (#%list 3 4 5))))
|
|
'12)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply
|
|
(lambda (x y z) (#%+ (begin (#%write 'a) x) y z))
|
|
(#%list e1 e2 e3))))
|
|
(if (= (optimize-level) 3)
|
|
'(let ([x e1] [y e2] [z e3])
|
|
(#3%+ (begin (#3%write 'a) x) y z))
|
|
'(let ([x e1] [y e2] [z e3])
|
|
(#2%+ (begin (#2%write 'a) x) y z))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%+ '(1 2 3 4))))
|
|
'10)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%+ (#%list 1 2 3 4))))
|
|
'10)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(lambda (x) (#%apply #%+ (#%list 1 2 x 4)))))
|
|
(if (= (optimize-level) 3)
|
|
'(lambda (x) (#3%+ 7 x))
|
|
'(lambda (x) (#2%+ 7 x))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%+ x y z)) (#%list e1 e2 e3))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%+ e1 e2 e3)
|
|
'(#2%+ e1 e2 e3)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply #%+ (#%list 1 (begin (#%write 'a) 2) 3))))
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) 6)
|
|
'(begin (#2%write 'a) 6)))
|
|
(let ([expr (parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (begin (#%write 'a) #%+)
|
|
(begin (#%write 'b) 4)
|
|
(begin
|
|
(#%write 'c)
|
|
(#%list
|
|
1
|
|
(begin (#%write 'd) 2)
|
|
(begin (#%write 'e) 3))))))])
|
|
(ormap
|
|
(lambda (groups) (equivalent-expansion? expr `(begin ,@(apply append groups) 10)))
|
|
($permutations
|
|
(if (= (optimize-level) 3)
|
|
'(((#3%write 'a)) ((#3%write 'b)) ((#3%write 'c) (#3%write 'd) (#3%write 'e)))
|
|
'(((#2%write 'a)) ((#2%write 'b)) ((#2%write 'c) (#2%write 'd) (#2%write 'e)))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%vector x y)) (#%list e1 2 e3))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%vector e1 2)
|
|
'(begin e3 (#2%vector e1 2))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(lambda (x) (#%apply x '(1 2 3)))))
|
|
'(lambda (x) (x 1 2 3)))
|
|
(let ([q (parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply e0 (#%list e1 e2 e3))))])
|
|
(or (equivalent-expansion? q '(let ([t1 e1] [t2 e2] [t3 e3]) (e0 t1 t2 t3)))
|
|
(equivalent-expansion? q '(let ([t0 e0]) (t0 e1 e2 e3)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply
|
|
(case-lambda [(x y) x] [(a b c d e) c])
|
|
(#%list 1 2 3 4 5))))
|
|
'3)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (case-lambda [(x y) x] [r r]) (#%list 1 2 3 4 5))))
|
|
'(#3%list 1 2 3 4 5))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (case-lambda [(x y) x] [r r]) (#%list 1 2 q 4 5))))
|
|
'(#3%list 1 2 q 4 5))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%apply #%+ (#%list 1 2 3 (#%list 4 5)))))
|
|
15)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%apply #%apply #%apply #%apply #%+ (#%list 1 2 3 (#%list 4 5 (#%list 6 7 (#%list* 8 9 (#%list (#%list 10)))))))))
|
|
55)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%apply #%apply #%apply #%+ (#%cons 1 (#%list 2 3 (#%cons* 4 (#%list 5 (#%cons 6 (#%list* 7 (#%list 8 (#%cons 9 '(10))))))))))))
|
|
55)
|
|
(begin
|
|
(define $check-writes
|
|
(lambda (eepat x)
|
|
(define ordered?
|
|
(lambda (ls)
|
|
(define same-prefix?
|
|
(lambda (ls1 ls2)
|
|
(or (null? ls2)
|
|
(and (eqv? (car ls1) (car ls2))
|
|
(same-prefix? (cdr ls1) (cdr ls2))))))
|
|
(null?
|
|
(let f ([ls ls] [q '()] [qlen 0])
|
|
(if (null? ls)
|
|
'()
|
|
(let ([x (car ls)])
|
|
(let ([xlen (length x)])
|
|
(cond
|
|
[(fx= xlen qlen) (f (cdr ls) x xlen)]
|
|
[(fx< xlen qlen) ls]
|
|
[else (and (fx= xlen (fx+ qlen 1))
|
|
(same-prefix? x q)
|
|
(let ([ls (f (cdr ls) x xlen)])
|
|
(and ls (f ls q qlen))))]))))))))
|
|
(syntax-case x (begin $primitive quote)
|
|
[(begin
|
|
(($primitive level write) (quote (d ...)))
|
|
...
|
|
ans)
|
|
(begin
|
|
(unless (equivalent-expansion? #'ans eepat) (errorf #f "~s is not equivalent to ~s" #'ans eepat))
|
|
(unless (ordered? #'((d ...) ...)) (errorf #f "writes are out-of-order in ~s" x))
|
|
#t)]
|
|
[_ (errorf #f "unexpected output pattern for ~s" x)])))
|
|
#t)
|
|
($check-writes 55
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(let ()
|
|
(import (chezscheme))
|
|
(let ([list (begin (write '()) list)] [list* (if #t list* list)])
|
|
(write '(1))
|
|
((begin (write '(1 1)) apply)
|
|
(begin (write '(1 2)) apply)
|
|
(begin (write '(1 3)) apply)
|
|
(let ([waste (write '(1 4))]) apply)
|
|
(begin (write '(1 5)) apply)
|
|
(begin (write '(1 6)) +)
|
|
(begin (write '(1 7))
|
|
((begin (write '(1 7 1)) list)
|
|
(begin (write '(1 7 2)) 1)
|
|
(begin (write '(1 7 3)) 2)
|
|
(begin (write '(1 7 4)) 3)
|
|
(begin (write '(1 7 5))
|
|
((begin (write '(1 7 5 1)) list)
|
|
(begin (write '(1 7 5 2)) 4)
|
|
(begin (write '(1 7 5 3)) 5)
|
|
(begin (write '(1 7 5 4))
|
|
((begin (write '(1 7 5 4 1)) list)
|
|
(begin (write '(1 7 5 4 2)) 6)
|
|
(begin (write '(1 7 5 4 3)) 7)
|
|
(begin (write '(1 7 5 4 4))
|
|
((begin (write '(1 7 5 4 4 1)) list*)
|
|
(begin (write '(1 7 5 4 4 2)) 8)
|
|
(begin (write '(1 7 5 4 4 3)) 9)
|
|
(begin (write '(1 7 5 4 4 4))
|
|
((begin (write '(1 7 5 4 4 1)) list)
|
|
(begin (write '(1 7 5 4 4 2))
|
|
((begin (write '(1 7 5 4 4 2 1)) list)
|
|
(begin (write '(1 7 5 4 4 2 2)) 10)))))))))))))))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 (cp0 (cp0 x))))])
|
|
(expand/optimize '(#%apply #%apply #%+ (#%list 1 2 3 (#%list 4 5)))))
|
|
'15)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply (lambda () 7) (#%list* '()))))
|
|
'7)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%+ x y z)) (#%list* 3 4 '(5)))))
|
|
'12)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply #%+ (#%list* e '(2 3)))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%+ 5 e)
|
|
'(#2%+ 5 e)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply
|
|
(lambda (x y z) (#%+ (begin (#%write 'a) x) y z))
|
|
(#%list* e1 e2 e3 '()))))
|
|
(if (= (optimize-level) 3)
|
|
'(let ([x e1] [y e2] [z e3])
|
|
(#3%+ (begin (#3%write 'a) x) y z))
|
|
'(let ([x e1] [y e2] [z e3])
|
|
(#2%+ (begin (#2%write 'a) x) y z))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%+ x y z)) (#%list* e1 e2 e3 '()))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%+ e1 e2 e3)
|
|
'(#2%+ e1 e2 e3)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply #%+ (#%list* 1 (begin (#%write 'a) 2) '(3)))))
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) 6)
|
|
'(begin (#2%write 'a) 6)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (lambda (x y z) (#%vector x y)) (#%list* e1 2 e3 '()))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%vector e1 2)
|
|
'(begin e3 (#2%vector e1 2))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(#%apply (lambda (x y z) (#%vector x y z)) (#%list* 1 '(2 3)))))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%vector 1 2 3)
|
|
'(#2%vector 1 2 3)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(lambda (r) (#%apply (lambda (x y z) (#%vector x y z)) (#%list* 1 r)))))
|
|
(if (= (optimize-level) 3)
|
|
'(lambda (r) (let ([y (#3%car r)]) (#3%vector 1 y (#3%car (#3%cdr r)))))
|
|
'(lambda (r) (#2%apply (lambda (x y z) (#2%vector x y z)) 1 r))))
|
|
(let ([expr (parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(#%apply (begin (#%write 'a) #%+)
|
|
(begin (#%write 'b) 4)
|
|
(begin
|
|
(#%write 'c)
|
|
(#%list*
|
|
1
|
|
(begin (#%write 'd) 2)
|
|
(begin (#%write 'e) '(3)))))))])
|
|
(ormap
|
|
(lambda (groups) (equivalent-expansion? expr `(begin ,@(apply append groups) 10)))
|
|
($permutations
|
|
(if (= (optimize-level) 3)
|
|
'(((#3%write 'a)) ((#3%write 'b)) ((#3%write 'c) (#3%write 'd) (#3%write 'e)))
|
|
'(((#2%write 'a)) ((#2%write 'b)) ((#2%write 'c) (#2%write 'd) (#2%write 'e)))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize '(let ([x (cons 0 (list))]) (#%apply #%zero? x))))
|
|
#t)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
;; don't fold primitive in value context with bad apply convention
|
|
(expand/optimize '(#%apply #%zero? 0)))
|
|
(if (= (optimize-level) 3)
|
|
'(#3%apply #3%zero? 0)
|
|
'(#2%apply #2%zero? 0)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
;; don't fold primitive in test context with bad apply convention
|
|
(expand/optimize '(if (#%apply #%eof-object 1 2 3) 4 5)))
|
|
(if (= (optimize-level) 3)
|
|
'(if (#3%apply #3%eof-object 1 2 3) 4 5)
|
|
'(if (#2%apply #2%eof-object 1 2 3) 4 5)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
;; don't fold primitive in effect context with bad apply convention
|
|
(expand/optimize '(begin (#%apply #%box? 'step) 3)))
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%apply #3%box? 'step) 3)
|
|
'(begin (#2%apply #2%box? 'step) 3)))
|
|
)
|
|
|
|
(mat cp0-car/cdr
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%car)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'f) ($yyy) (#3%write 'e) ($xxx))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'f) ($yyy) (#2%write 'e) ($xxx))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%car)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'f) ($yyy) (#3%write 'g) ($zzz) (#3%write 'e) ($xxx))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'f) ($yyy) (#2%write 'g) ($zzz) (#2%write 'e) ($xxx))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%car)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'f) ($yyy) (#3%write 'g) ($zzz) (#3%write 'e) ($xxx))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'f) ($yyy) (#2%write 'g) ($zzz) (#2%write 'e) ($xxx))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%car)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'f) ($yyy) (#3%write 'g) ($zzz) (#3%write 'e) ($xxx))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'f) ($yyy) (#2%write 'g) ($zzz) (#2%write 'e) ($xxx))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%list (begin (#3%write 'f) ($yyy)) (begin (#3%write 'g) ($zzz))))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%list (begin (#2%write 'f) ($yyy)) (begin (#2%write 'g) ($zzz))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%list* (begin (#3%write 'f) ($yyy)) (begin (#3%write 'g) ($zzz))))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%list* (begin (#2%write 'f) ($yyy)) (begin (#2%write 'g) ($zzz))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))
|
|
(begin (#%write 'g) ($zzz))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%cons* (begin (#3%write 'f) ($yyy)) (begin (#3%write 'g) ($zzz))))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%cons* (begin (#2%write 'f) ($yyy)) (begin (#2%write 'g) ($zzz))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons*)
|
|
(begin (#%write 'e) ($xxx))
|
|
(begin (#%write 'f) ($yyy))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%list*)
|
|
(begin (#%write 'e) ($xxx))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%cdr (begin (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx))))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%cdr (begin (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx))))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(expand/optimize
|
|
'(begin (#%write 'a)
|
|
((begin (#%write 'b) #%cdr)
|
|
(begin (#%write 'c)
|
|
((begin (#%write 'd) #%cons*)
|
|
(begin (#%write 'e) ($xxx))))))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%cdr (begin (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx))))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%cdr (begin (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx))))))
|
|
)
|
|
|
|
(mat cp0-seq-ref
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(vector-ref (vector 1 2 3) 1)))
|
|
2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(list-ref (list 1 2 3) 1)))
|
|
2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(list-ref (list* 1 2 3) 1)))
|
|
2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(list-ref (cons* 1 2 3) 1)))
|
|
2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(fxvector-ref (fxvector 1 2 3) 1)))
|
|
2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(string-ref (string #\1 #\2 #\3) 1)))
|
|
#\2)
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) vector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) vector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) vector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) vector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 3)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%vector-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#3%vector
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 3)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%vector-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%vector
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 3)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) list-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) list)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) list-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) list*)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) list-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) cons*)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) ($yyy))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) list-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) cons*)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 2)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%list-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#3%cons*
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 2)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%list-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%cons*
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 2)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) string-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) string)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) #\y)
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) #\y)
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) #\y)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) string-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) string)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) 'oops)
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) 'oops)
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%string-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%string
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) 'oops)
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) string-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) string)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%string-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%string
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) string-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) #2%string)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%string-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#2%string
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 1)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%string-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%string
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) string-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) string)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 3)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%string-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#3%string
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 3)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%string-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%string
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 3)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) fxvector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) fxvector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) 121)
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) 121)
|
|
'(begin (#2%write 'a) (#2%write 'b) (#2%write 'h) (#2%write 'c) (#2%write 'd) (#2%write 'e) ($xxx) (#2%write 'g) ($zzz) (#2%write 'f) 121)))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) fxvector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) fxvector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) 'oops)
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) 'oops)
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%fxvector-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%fxvector
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) 'oops)
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) fxvector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) fxvector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin (#3%write 'a) (#3%write 'b) (#3%write 'h) (#3%write 'c) (#3%write 'd) (#3%write 'e) ($xxx) (#3%write 'g) ($zzz) (#3%write 'f) ($yyy))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%fxvector-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%fxvector
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) fxvector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) #2%fxvector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 1)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%fxvector-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#2%fxvector
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 1)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%fxvector-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%fxvector
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 1)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f] [optimize-level (max (optimize-level) 2)])
|
|
(expand/optimize
|
|
'(begin (write 'a)
|
|
((begin (write 'b) fxvector-ref)
|
|
(begin (write 'c)
|
|
((begin (write 'd) fxvector)
|
|
(begin (write 'e) ($xxx))
|
|
(begin (write 'f) ($yyy))
|
|
(begin (write 'g) ($zzz))))
|
|
(begin (write 'h) 3)))))
|
|
; other possibilities exist but are too many to list and too difficult to construct with $permutations.
|
|
; if you see a problem, convert to use $check-writes (defined above)
|
|
(if (= (optimize-level) 3)
|
|
'(begin
|
|
(#3%write 'a)
|
|
(#3%write 'b)
|
|
(#3%fxvector-ref
|
|
(begin
|
|
(#3%write 'c)
|
|
(#3%write 'd)
|
|
(#3%fxvector
|
|
(begin (#3%write 'e) ($xxx))
|
|
(begin (#3%write 'f) ($yyy))
|
|
(begin (#3%write 'g) ($zzz))))
|
|
(begin (#3%write 'h) 3)))
|
|
'(begin
|
|
(#2%write 'a)
|
|
(#2%write 'b)
|
|
(#2%fxvector-ref
|
|
(begin
|
|
(#2%write 'c)
|
|
(#2%write 'd)
|
|
(#2%fxvector
|
|
(begin (#2%write 'e) ($xxx))
|
|
(begin (#2%write 'f) ($yyy))
|
|
(begin (#2%write 'g) ($zzz))))
|
|
(begin (#2%write 'h) 3)))))
|
|
)
|
|
|
|
(mat let-pushing
|
|
; make sure letify doesn't drop the let binding for x into the call to cons which would
|
|
; cause the allocation of z's location not to be in the continuation of the rhs of x.
|
|
(equal?
|
|
(let ([ls '()])
|
|
(let ([th.k (let ([x (call/cc (lambda (k) k))] [z 0])
|
|
(cons (lambda () (set! z (+ z 1)) z) x))])
|
|
(and (set! ls (cons ((car th.k)) ls))
|
|
(set! ls (cons ((car th.k)) ls))
|
|
((cdr th.k) (lambda (x) (set! ls (cons 17 ls))))))
|
|
ls)
|
|
'(17 2 1 2 1))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(lambda (x) (letrec ([y (if (pair? x) (#3%car x) x)]) 4))))
|
|
'(lambda (x) 4))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(let ([x e]) (list (list x)))))
|
|
'(#2%list (#2%list e)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(let ([x (lambda (x) x)]) (list (list x) (list 3)))))
|
|
'(#2%list (#2%list (lambda (x) x)) (#2%list 3)))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(lambda (y) (let ([x (+ y y)] [z #f]) (list (lambda () (set! z 15) z) x)))))
|
|
'(lambda (y) (let ([x (#2%+ y y)] [z #f]) (#2%list (lambda () (set! z 15) z) x))))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 3])
|
|
(expand/optimize
|
|
'(lambda (y) (let ([x (+ y y)] [z #f]) (list (lambda () (set! z 15) z) x)))))
|
|
; doesn't push (+ y y) because it's not pure and one of the vars (z) is assigned
|
|
'(lambda (y) (let ([x (#3%+ y y)] [z #f]) (#3%list (lambda () (set! z 15) z) x))))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 3])
|
|
(expand/optimize
|
|
'(lambda (y) (let ([x (make-message-condition y)] [z #f]) (list (lambda () (set! z 15) z) x)))))
|
|
; does push (make-message-condition y) because it is pure, even though one of the vars (z) is assigned
|
|
'(lambda (y) (let ([z #f]) (#3%list (lambda () (set! z 15) z) (#3%make-message-condition y)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2] [compile-profile #f])
|
|
(expand/optimize
|
|
'(let ()
|
|
(define-record foo ((immutable boolean x)))
|
|
(or (foo-x e1) e2))))
|
|
`(if (let ([g0 e1])
|
|
(if (#3%record? g0 ',record-type-descriptor?)
|
|
(#2%void)
|
|
(#3%$record-oops 'foo-x g0 ',record-type-descriptor?))
|
|
(#3%$object-ref 'boolean g0 ,fixnum?))
|
|
#t
|
|
e2))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 3] [compile-profile #f])
|
|
(expand/optimize
|
|
'(let ()
|
|
(define-record foo ((immutable boolean x)))
|
|
(or (foo-x e1) e2))))
|
|
`(if (#3%$object-ref 'boolean e1 ,fixnum?) #t e2))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(lambda (v)
|
|
(let ([v2 (if (vector? v) v (error))])
|
|
(let ([q (vector-sort v2)] [n (#3%vector-length v)])
|
|
(display "1")
|
|
(list q n))))))
|
|
'(lambda (v)
|
|
(let ([v2 (if (#2%vector? v) v (#2%error))])
|
|
(let ([q (#2%vector-sort v2)] [n (#3%vector-length v)])
|
|
(#2%display "1")
|
|
(#2%list q n)))))
|
|
(equivalent-expansion?
|
|
(parameterize ([#%$suppress-primitive-inlining #f] [run-cp0 (lambda (cp0 x) (cp0 x))] [optimize-level 2])
|
|
(expand/optimize
|
|
'(lambda (v)
|
|
(let ([v2 (if (vector? v) v (error))])
|
|
(let ([q (vector-sort v2)] [n (or v 72)])
|
|
(display "1")
|
|
(list q n))))))
|
|
'(lambda (v)
|
|
(let ([q (#2%vector-sort (if (#2%vector? v) v (#2%error)))]
|
|
[n (if v v 72)])
|
|
(#2%display "1")
|
|
(#2%list q n))))
|
|
)
|
|
|
|
(mat equality-of-refs
|
|
(begin
|
|
(define-syntax eqtest
|
|
(syntax-rules ()
|
|
[(_ eqprim) (eqtest eqprim #f)]
|
|
[(_ eqprim generic?)
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(let ([arity-mask (procedure-arity-mask eqprim)] [primref `($primitive ,(if (= (optimize-level) 3) 3 2) eqprim)])
|
|
(define-syntax ifsafe
|
|
(syntax-rules ()
|
|
[(_ n e1 e2)
|
|
(if (and (fxbit-set? arity-mask n) (or generic? (= (optimize-level) 3))) e1 e2)]))
|
|
(and
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x)))
|
|
(ifsafe 1
|
|
`(lambda (x) #t)
|
|
`(lambda (x) (,primref x))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim (begin (x) x))))
|
|
(ifsafe 1
|
|
`(lambda (x) (x) #t)
|
|
`(lambda (x) (,primref (begin (x) x)))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (set! x (x x)) (x (eqprim x))))
|
|
(ifsafe 1
|
|
`(lambda (x) (set! x (x x)) (x #t))
|
|
`(lambda (x) (set! x (x x)) (x (,primref x)))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim (x x))))
|
|
(ifsafe 1
|
|
`(lambda (x) (x x) #t)
|
|
`(lambda (x) (,primref (x x)))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x x)))
|
|
(ifsafe 2
|
|
`(lambda (x) #t)
|
|
`(lambda (x) (,primref x x))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim (begin (x) x) x)))
|
|
(ifsafe 2
|
|
`(lambda (x) (x) #t)
|
|
`(lambda (x) (,primref (begin (x) x) x))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x (begin (x) x))))
|
|
(ifsafe 2
|
|
`(lambda (x) (x) #t)
|
|
`(lambda (x) (,primref x (begin (x) x)))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim (begin (x) x) (begin (x x) x))))
|
|
(ifsafe 2
|
|
`(lambda (x) (x) (x x) #t)
|
|
`(lambda (x) (,primref (begin (x) x) (begin (x x) x)))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x y) (eqprim x y)))
|
|
`(lambda (x y) (,primref x y)))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x x x x x)))
|
|
(ifsafe 5
|
|
`(lambda (x) #t)
|
|
`(lambda (x) (,primref x x x x x))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x y) (eqprim x x x x y)))
|
|
`(lambda (x y) (,primref x x x x y)))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x x (begin (x) x) x x)))
|
|
(ifsafe 5
|
|
`(lambda (x) (x) #t)
|
|
`(lambda (x) (,primref x x (begin (x) x) x x))))
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (eqprim x x (begin (set! x 15) x) x x)))
|
|
`(lambda (x) (,primref x x (begin (set! x 15) x) x x)))
|
|
)))]))
|
|
#t)
|
|
(eqtest eq? #t)
|
|
(eqtest eqv? #t)
|
|
(eqtest equal? #t)
|
|
(eqtest bytevector=?)
|
|
(eqtest enum-set=?)
|
|
(eqtest bound-identifier=?)
|
|
(eqtest free-identifier=?)
|
|
(eqtest ftype-pointer=?)
|
|
(eqtest literal-identifier=?)
|
|
(eqtest time=?)
|
|
(eqtest boolean=?)
|
|
(eqtest symbol=?)
|
|
(eqtest char=?)
|
|
(eqtest char-ci=?)
|
|
(eqtest string=?)
|
|
(eqtest string-ci=?)
|
|
(eqtest r6rs:char=?)
|
|
(eqtest r6rs:char-ci=?)
|
|
(eqtest r6rs:string=?)
|
|
(eqtest r6rs:string-ci=?)
|
|
(eqtest fx=)
|
|
(eqtest fx=?)
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (fl= x x))) ; x could be +nan.0
|
|
`(lambda (x) (($primitive ,(if (fx= (optimize-level) 3) 3 2) fl=) x x))))
|
|
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
|
(equivalent-expansion?
|
|
(expand/optimize
|
|
`(lambda (x) (= x x))) ; x could be +nan.0
|
|
`(lambda (x) (($primitive ,(if (fx= (optimize-level) 3) 3 2) =) x x))))
|
|
)
|