memq is open-coded if the second argument is a constant list
This commit is contained in:
parent
0d476b91e2
commit
ac38b15c6c
BIN
lib/ikarus.boot
BIN
lib/ikarus.boot
Binary file not shown.
|
@ -862,9 +862,58 @@
|
|||
(Expr x)
|
||||
x)
|
||||
|
||||
(module (tally-giveup)
|
||||
(define giveup-list '())
|
||||
(define (tally-giveup op)
|
||||
(cond
|
||||
[(getprop op '*compiler-giveup-tally*) =>
|
||||
(lambda (n)
|
||||
(putprop op '*compiler-giveup-tally* (add1 n)))]
|
||||
[else
|
||||
(set! giveup-list (cons op giveup-list))
|
||||
(putprop op '*compiler-giveup-tally* 1)]))
|
||||
(define (print-tally)
|
||||
(for-each
|
||||
(lambda (x)
|
||||
(let ([n (getprop x '*compiler-giveup-tally*)])
|
||||
(when (> n 100)
|
||||
(printf "~s ~s\n" n x))))
|
||||
giveup-list))
|
||||
(primitive-set! 'compiler-giveup-tally print-tally))
|
||||
|
||||
#|FIXME:missing-optimizations
|
||||
128 list*
|
||||
111 cadr
|
||||
464 $record/rtd?
|
||||
404 memq
|
||||
249 map
|
||||
114 not
|
||||
451 car
|
||||
224 syntax-error
|
||||
248 $syntax-dispatch
|
||||
237 pair?
|
||||
125 length
|
||||
165 $cdr
|
||||
137 $car
|
||||
805 $record-ref
|
||||
181 fixnum?
|
||||
328 null?
|
||||
136 fx-
|
||||
207 eq?
|
||||
153 call-with-values
|
||||
165 values
|
||||
336 apply
|
||||
384 cdr
|
||||
898 cons
|
||||
747 error
|
||||
331 primitive-set!
|
||||
555 void
|
||||
645 list
|
||||
|#
|
||||
|
||||
(define (optimize-primcall ctxt op rand*)
|
||||
(define (giveup)
|
||||
(tally-giveup op)
|
||||
(make-funcall (make-primref op) rand*))
|
||||
(define (constant-value x k)
|
||||
(record-case x
|
||||
|
@ -903,6 +952,23 @@
|
|||
(optimize-primcall ctxt 'memq rand*)]
|
||||
[else #f])))))
|
||||
(giveup))]
|
||||
[(memq)
|
||||
(or (and (fx= (length rand*) 2)
|
||||
(let ([a0 (car rand*)] [a1 (cadr rand*)])
|
||||
(constant-value a1
|
||||
(lambda (ls)
|
||||
(cond
|
||||
[(not (list? ls)) #f]
|
||||
[(eq? ctxt 'e) (make-seq a0 a1)]
|
||||
[(constant-value a0
|
||||
(lambda (x)
|
||||
(mk-seq (mk-seq a0 a1)
|
||||
(case ctxt
|
||||
[(v) (make-constant (memq x ls))]
|
||||
[else (make-constant
|
||||
(if (memq x ls) #t #f))]))))]
|
||||
[else (make-primcall '$memq rand*)])))))
|
||||
(giveup))]
|
||||
[else (giveup)]))
|
||||
|
||||
|
||||
|
@ -2884,6 +2950,26 @@
|
|||
[($fp-overflow)
|
||||
(list* (cmpl (pcb-ref 'frame-redline) fpr)
|
||||
(cond-branch 'jle Lt Lf ac))]
|
||||
[($memq)
|
||||
(record-case (cadr rand*)
|
||||
[(constant ls)
|
||||
(let-values ([(Lt ac)
|
||||
(if Lt
|
||||
(values Lt ac)
|
||||
(let ([L (unique-label)])
|
||||
(values L (cons L ac))))])
|
||||
(NonTail (car rand*)
|
||||
(let f ([ls ls])
|
||||
(cond
|
||||
[(null? ls)
|
||||
(if Lf (list* (jmp Lf) ac) ac)]
|
||||
[else
|
||||
(list* (cmpl (Simple (make-constant (car ls))) eax)
|
||||
(je Lt)
|
||||
(f (cdr ls)))]))))]
|
||||
[else
|
||||
(error 'compile
|
||||
"BUG: second arg to $memq should be constant")])]
|
||||
[($vector-ref top-level-value car cdr $record-ref)
|
||||
(do-value-prim op rand*
|
||||
(do-simple-test eax Lt Lf ac))]
|
||||
|
@ -3416,6 +3502,28 @@
|
|||
(NonTail
|
||||
(make-closure (make-code-loc SL_values) arg*)
|
||||
ac)]
|
||||
[($memq)
|
||||
(record-case (cadr arg*)
|
||||
[(constant ls)
|
||||
(let-values ([(Lt ac)
|
||||
(let ([L (unique-label)])
|
||||
(values L (cons L ac)))])
|
||||
(NonTail (car arg*)
|
||||
(list*
|
||||
(movl eax ebx)
|
||||
(let f ([ls ls])
|
||||
(cond
|
||||
[(null? ls)
|
||||
(list* (movl (int bool-f) eax) ac)]
|
||||
[else
|
||||
(list*
|
||||
(movl (obj ls) eax)
|
||||
(cmpl (Simple (make-constant (car ls))) ebx)
|
||||
(je Lt)
|
||||
(f (cdr ls)))])))))]
|
||||
[else
|
||||
(error 'compile
|
||||
"BUG: second arg to $memq should be constant")])]
|
||||
[else
|
||||
(error 'value-prim "unhandled ~s" op)]))
|
||||
(define (indirect-assignment arg* offset ac)
|
||||
|
|
|
@ -131,6 +131,8 @@
|
|||
$flush-output-port *standard-output-port* *standard-error-port*
|
||||
*current-output-port* *standard-input-port* *current-input-port*
|
||||
|
||||
;;;
|
||||
compiler-giveup-tally
|
||||
))
|
||||
|
||||
|
||||
|
@ -264,3 +266,5 @@
|
|||
(format "cat ~a > ikarus.boot"
|
||||
(join " " (map caddr scheme-library-files))))
|
||||
|
||||
;(#%compiler-giveup-tally)
|
||||
|
||||
|
|
Loading…
Reference in New Issue