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
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum