more optimizations
This commit is contained in:
		
							parent
							
								
									15a36e7333
								
							
						
					
					
						commit
						06c64dab3a
					
				
							
								
								
									
										
											BIN
										
									
								
								lib/ikarus.boot
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/ikarus.boot
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -913,7 +913,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (optimize-primcall ctxt op rand*)
 | 
					(define (optimize-primcall ctxt op rand*)
 | 
				
			||||||
  (define (giveup)
 | 
					  (define (giveup)
 | 
				
			||||||
    (tally-giveup op)
 | 
					 | 
				
			||||||
    (make-funcall (make-primref op) rand*))
 | 
					    (make-funcall (make-primref op) rand*))
 | 
				
			||||||
  (define (constant-value x k) 
 | 
					  (define (constant-value x k) 
 | 
				
			||||||
    (record-case x 
 | 
					    (record-case x 
 | 
				
			||||||
| 
						 | 
					@ -1008,7 +1007,125 @@
 | 
				
			||||||
                           (list a0 (make-constant (car ls)))))]
 | 
					                           (list a0 (make-constant (car ls)))))]
 | 
				
			||||||
                      [else (make-primcall '$memq rand*)])))))
 | 
					                      [else (make-primcall '$memq rand*)])))))
 | 
				
			||||||
         (giveup))]
 | 
					         (giveup))]
 | 
				
			||||||
    [else (giveup)]))
 | 
					    [(list)
 | 
				
			||||||
 | 
					     (case ctxt
 | 
				
			||||||
 | 
					       [(v) (if (null? rand*) (make-constant '()) (giveup))]
 | 
				
			||||||
 | 
					       [else
 | 
				
			||||||
 | 
					        (if (null? rand*)
 | 
				
			||||||
 | 
					            (make-constant #t)
 | 
				
			||||||
 | 
					            (let f ([a (car rand*)] [d (cdr rand*)])
 | 
				
			||||||
 | 
					              (cond
 | 
				
			||||||
 | 
					                [(null? d) (make-seq a (make-constant #t))]
 | 
				
			||||||
 | 
					                [else
 | 
				
			||||||
 | 
					                 (f (make-seq a (car d)) (cdr d))])))])]
 | 
				
			||||||
 | 
					    [(list*)
 | 
				
			||||||
 | 
					     (case ctxt
 | 
				
			||||||
 | 
					       [(e) 
 | 
				
			||||||
 | 
					        (cond
 | 
				
			||||||
 | 
					          [(null? rand*) (giveup)]
 | 
				
			||||||
 | 
					          [else
 | 
				
			||||||
 | 
					           (let f ([a (car rand*)] [d (cdr rand*)])
 | 
				
			||||||
 | 
					             (cond
 | 
				
			||||||
 | 
					               [(null? d) a]
 | 
				
			||||||
 | 
					               [else (f (mk-seq a (car d)) (cdr d))]))])]
 | 
				
			||||||
 | 
					       [(p) 
 | 
				
			||||||
 | 
					        (cond
 | 
				
			||||||
 | 
					          [(null? rand*) (giveup)]
 | 
				
			||||||
 | 
					          [(null? (cdr rand*)) 
 | 
				
			||||||
 | 
					           (let ([a (car rand*)])
 | 
				
			||||||
 | 
					             (or (constant-value a
 | 
				
			||||||
 | 
					                   (lambda (v)
 | 
				
			||||||
 | 
					                     (mk-seq a (make-constant (if v #t #f)))))
 | 
				
			||||||
 | 
					                 a))]
 | 
				
			||||||
 | 
					          [else 
 | 
				
			||||||
 | 
					           (let f ([a (car rand*)] [d (cdr rand*)])
 | 
				
			||||||
 | 
					             (cond
 | 
				
			||||||
 | 
					               [(null? d) (mk-seq a (make-constant #t))]
 | 
				
			||||||
 | 
					               [else (f (mk-seq a (car d)) (cdr d))]))])]
 | 
				
			||||||
 | 
					       [else
 | 
				
			||||||
 | 
					        (cond
 | 
				
			||||||
 | 
					          [(null? rand*) (giveup)]
 | 
				
			||||||
 | 
					          [(null? (cdr rand*)) (car rand*)]
 | 
				
			||||||
 | 
					          [else (giveup)])])]
 | 
				
			||||||
 | 
					    [(cons)
 | 
				
			||||||
 | 
					     (or (and (fx= (length rand*) 2)
 | 
				
			||||||
 | 
					              (let ([a0 (car rand*)] [a1 (cadr rand*)])
 | 
				
			||||||
 | 
					                (case ctxt
 | 
				
			||||||
 | 
					                  [(e) (mk-seq a0 a1)]
 | 
				
			||||||
 | 
					                  [(p) (mk-seq (mk-seq a0 a1) (make-constant #t))]
 | 
				
			||||||
 | 
					                  [else (giveup)])))
 | 
				
			||||||
 | 
					         (giveup))]
 | 
				
			||||||
 | 
					    [($record-ref $record/rtd?)
 | 
				
			||||||
 | 
					     (or (and (fx= (length rand*) 2)
 | 
				
			||||||
 | 
					              (let ([a0 (car rand*)] [a1 (cadr rand*)])
 | 
				
			||||||
 | 
					                (case ctxt
 | 
				
			||||||
 | 
					                  [(e) (mk-seq a0 a1)]
 | 
				
			||||||
 | 
					                  [else 
 | 
				
			||||||
 | 
					                   (or (constant-value a1
 | 
				
			||||||
 | 
					                         (lambda (n1)
 | 
				
			||||||
 | 
					                           (mk-seq a1
 | 
				
			||||||
 | 
					                             (make-primcall op
 | 
				
			||||||
 | 
					                                (list a0 (make-constant n1))))))
 | 
				
			||||||
 | 
					                       (make-primcall op rand*))])))
 | 
				
			||||||
 | 
					         (error 'optimize "~s rands to ~s" (map unparse rand*) op))]
 | 
				
			||||||
 | 
					    [(void)
 | 
				
			||||||
 | 
					     (or (and (null? rand*)
 | 
				
			||||||
 | 
					              (case ctxt
 | 
				
			||||||
 | 
					                [(p) (make-constant #t)]
 | 
				
			||||||
 | 
					                [else (make-constant (void))]))
 | 
				
			||||||
 | 
					         (giveup))]
 | 
				
			||||||
 | 
					    [(car cdr)
 | 
				
			||||||
 | 
					     (or (and (fx= (length rand*) 1)
 | 
				
			||||||
 | 
					              (let ([a (car rand*)])
 | 
				
			||||||
 | 
					                (constant-value a
 | 
				
			||||||
 | 
					                  (lambda (v)
 | 
				
			||||||
 | 
					                    (and (pair? v)
 | 
				
			||||||
 | 
					                         (mk-seq a
 | 
				
			||||||
 | 
					                           (make-constant
 | 
				
			||||||
 | 
					                             (case op
 | 
				
			||||||
 | 
					                               [(car) (car v)]
 | 
				
			||||||
 | 
					                               [else  (cdr v)]))))))))
 | 
				
			||||||
 | 
					         (giveup))]
 | 
				
			||||||
 | 
					    [(not null? pair? fixnum? vector?)
 | 
				
			||||||
 | 
					     (or (and (fx= (length rand*) 1)
 | 
				
			||||||
 | 
					              (let ([a (car rand*)])
 | 
				
			||||||
 | 
					                (case ctxt
 | 
				
			||||||
 | 
					                  [(e) a]
 | 
				
			||||||
 | 
					                  [else
 | 
				
			||||||
 | 
					                   (constant-value a
 | 
				
			||||||
 | 
					                     (lambda (v)
 | 
				
			||||||
 | 
					                       (mk-seq a
 | 
				
			||||||
 | 
					                         (make-constant
 | 
				
			||||||
 | 
					                           (case op
 | 
				
			||||||
 | 
					                             [(not) (not v)]
 | 
				
			||||||
 | 
					                             [(null?) (null? v)]
 | 
				
			||||||
 | 
					                             [(pair?) (pair? v)]
 | 
				
			||||||
 | 
					                             [(fixnum?) (fixnum? v)]
 | 
				
			||||||
 | 
					                             [(vector?) (vector? v)]
 | 
				
			||||||
 | 
					                             [else 
 | 
				
			||||||
 | 
					                              (error 'optimize
 | 
				
			||||||
 | 
					                                "huh ~s" op)])))))])))
 | 
				
			||||||
 | 
					         (giveup))]
 | 
				
			||||||
 | 
					    [($car $cdr)
 | 
				
			||||||
 | 
					     (or (and (fx= (length rand*) 1)
 | 
				
			||||||
 | 
					              (let ([a (car rand*)])
 | 
				
			||||||
 | 
					                (or (constant-value a
 | 
				
			||||||
 | 
					                      (lambda (v)
 | 
				
			||||||
 | 
					                        (if (pair? v)
 | 
				
			||||||
 | 
					                            (make-seq a
 | 
				
			||||||
 | 
					                              (make-constant
 | 
				
			||||||
 | 
					                                (case op
 | 
				
			||||||
 | 
					                                  [($car) (car v)]
 | 
				
			||||||
 | 
					                                  [else   (cdr v)])))
 | 
				
			||||||
 | 
					                            (error 'optimize
 | 
				
			||||||
 | 
					                                   "incorrect arg ~s to ~s"
 | 
				
			||||||
 | 
					                                   v op))))
 | 
				
			||||||
 | 
					                    (giveup))))
 | 
				
			||||||
 | 
					         (error 'optimize "incorrect args ~s to ~s"
 | 
				
			||||||
 | 
					                (map unparse rand*) op))]
 | 
				
			||||||
 | 
					    [else
 | 
				
			||||||
 | 
					     (tally-giveup op)
 | 
				
			||||||
 | 
					     (giveup)]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (copy-propagate x)
 | 
					(define (copy-propagate x)
 | 
				
			||||||
| 
						 | 
					@ -3737,7 +3854,7 @@
 | 
				
			||||||
           [(null? arg*) ac]
 | 
					           [(null? arg*) ac]
 | 
				
			||||||
           [else 
 | 
					           [else 
 | 
				
			||||||
            (Effect (car arg*) (f (cdr arg*)))]))]
 | 
					            (Effect (car arg*) (f (cdr arg*)))]))]
 | 
				
			||||||
      [(car) ;;; may signal an error
 | 
					      [(car cdr top-level-value) ;;; may signal an error
 | 
				
			||||||
       (do-value-prim op arg* ac)]
 | 
					       (do-value-prim op arg* ac)]
 | 
				
			||||||
      [else 
 | 
					      [else 
 | 
				
			||||||
       (error 'do-effect-prim "unhandled op ~s" op)]))
 | 
					       (error 'do-effect-prim "unhandled op ~s" op)]))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -266,5 +266,5 @@
 | 
				
			||||||
  (format "cat ~a > ikarus.boot"
 | 
					  (format "cat ~a > ikarus.boot"
 | 
				
			||||||
          (join " " (map caddr scheme-library-files))))
 | 
					          (join " " (map caddr scheme-library-files))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;(#%compiler-giveup-tally)
 | 
					(#%compiler-giveup-tally)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue