added some preliminary work for known-types.
This commit is contained in:
parent
71640d11bf
commit
0cd61369b2
|
@ -275,32 +275,78 @@
|
||||||
[(jmpcall label rator arg*) (or (NonTail rator) (ormap NonTail arg*))]
|
[(jmpcall label rator arg*) (or (NonTail rator) (ormap NonTail arg*))]
|
||||||
[(mvcall rator k) #t] ; punt
|
[(mvcall rator k) #t] ; punt
|
||||||
[else (error who "invalid expr" x)]))
|
[else (error who "invalid expr" x)]))
|
||||||
|
|
||||||
(define (insert-check x)
|
(define (insert-check x)
|
||||||
(make-seq (make-primcall '$stack-overflow-check '()) x))
|
(make-seq (make-primcall '$stack-overflow-check '()) x))
|
||||||
|
|
||||||
(define (ClambdaCase x)
|
(define (ClambdaCase x)
|
||||||
(struct-case x
|
(struct-case x
|
||||||
[(clambda-case info body)
|
[(clambda-case info body)
|
||||||
(make-clambda-case info (Main body))]))
|
(make-clambda-case info (Main body))]))
|
||||||
;;;
|
|
||||||
(define (Clambda x)
|
(define (Clambda x)
|
||||||
(struct-case x
|
(struct-case x
|
||||||
[(clambda label case* cp free* name)
|
[(clambda label case* cp free* name)
|
||||||
(make-clambda label (map ClambdaCase case*) cp free* name)]))
|
(make-clambda label (map ClambdaCase case*) cp free* name)]))
|
||||||
;;;
|
|
||||||
(define (Main x)
|
(define (Main x)
|
||||||
(if (Tail x)
|
(if (Tail x)
|
||||||
(insert-check x)
|
(insert-check x)
|
||||||
x))
|
x))
|
||||||
;;;
|
|
||||||
(define (Program x)
|
(define (Program x)
|
||||||
(struct-case x
|
(struct-case x
|
||||||
[(codes code* body)
|
[(codes code* body)
|
||||||
(make-codes (map Clambda code*) (Main body))]))
|
(make-codes (map Clambda code*) (Main body))]))
|
||||||
;;;
|
|
||||||
(Program x))
|
(Program x))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(define (insert-dummy-type-annotations x)
|
||||||
|
(define who 'insert-dummy-type-annotations)
|
||||||
|
(define (Closure x)
|
||||||
|
(struct-case x
|
||||||
|
[(closure code free*)
|
||||||
|
x]
|
||||||
|
;(make-closure (Expr code) (map Var free*))]
|
||||||
|
[else (error who "not a closure" x)]))
|
||||||
|
(define (Expr x)
|
||||||
|
(struct-case x
|
||||||
|
[(constant i)
|
||||||
|
(make-known x 'constant i)]
|
||||||
|
[(var) x]
|
||||||
|
[(primref op)
|
||||||
|
(make-known x 'primitive op)]
|
||||||
|
[(bind lhs* rhs* body)
|
||||||
|
(make-bind lhs* (map Expr rhs*) (Expr body))]
|
||||||
|
[(fix lhs* rhs* body)
|
||||||
|
(make-fix lhs* (map Closure rhs*) (Expr body))]
|
||||||
|
[(conditional e0 e1 e2)
|
||||||
|
(make-conditional (Expr e0) (Expr e1) (Expr e2))]
|
||||||
|
[(seq e0 e1)
|
||||||
|
(make-seq (Expr e0) (Expr e1))]
|
||||||
|
[(primcall op arg*)
|
||||||
|
(make-primcall op (map Expr arg*))]
|
||||||
|
[(forcall op arg*)
|
||||||
|
(make-forcall op (map Expr arg*))]
|
||||||
|
[(funcall rator arg*)
|
||||||
|
(make-funcall (Expr rator) (map Expr arg*))]
|
||||||
|
[(jmpcall label rator arg*)
|
||||||
|
(make-jmpcall label (Expr rator) (map Expr arg*))]
|
||||||
|
[(mvcall rator k)
|
||||||
|
(make-mvcall (Expr rator) (Expr k))]
|
||||||
|
[else (error who "invalid expr" x)]))
|
||||||
|
(define (ClambdaCase x)
|
||||||
|
(struct-case x
|
||||||
|
[(clambda-case info body)
|
||||||
|
(make-clambda-case info (Expr body))]))
|
||||||
|
(define (Clambda x)
|
||||||
|
(struct-case x
|
||||||
|
[(clambda label case* cp free* name)
|
||||||
|
(make-clambda label (map ClambdaCase case*) cp free* name)]))
|
||||||
|
(define (Program x)
|
||||||
|
(struct-case x
|
||||||
|
[(codes code* body)
|
||||||
|
(make-codes (map Clambda code*) (Expr body))]))
|
||||||
|
(Program x))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(include "pass-specify-rep.ss")
|
(include "pass-specify-rep.ss")
|
||||||
|
|
||||||
(define parameter-registers '(%edi))
|
(define parameter-registers '(%edi))
|
||||||
|
@ -2921,6 +2967,7 @@
|
||||||
[x (eliminate-fix x)]
|
[x (eliminate-fix x)]
|
||||||
[x (insert-engine-checks x)]
|
[x (insert-engine-checks x)]
|
||||||
[x (insert-stack-overflow-check x)]
|
[x (insert-stack-overflow-check x)]
|
||||||
|
;[x (insert-dummy-type-annotations x)]
|
||||||
[x (specify-representation x)]
|
[x (specify-representation x)]
|
||||||
[x (impose-calling-convention/evaluation-order x)]
|
[x (impose-calling-convention/evaluation-order x)]
|
||||||
[x (time-it "frame" (lambda () (assign-frame-sizes x)))]
|
[x (time-it "frame" (lambda () (assign-frame-sizes x)))]
|
||||||
|
|
|
@ -137,7 +137,7 @@
|
||||||
(define-struct assign (lhs rhs))
|
(define-struct assign (lhs rhs))
|
||||||
(define-struct mvcall (producer consumer))
|
(define-struct mvcall (producer consumer))
|
||||||
|
|
||||||
|
(define-struct known (expr type value))
|
||||||
|
|
||||||
(define-struct shortcut (body handler))
|
(define-struct shortcut (body handler))
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1476
|
1478
|
||||||
|
|
|
@ -139,11 +139,14 @@
|
||||||
[else
|
[else
|
||||||
(let-values ([(lhs* rhs* arg*) (S* (cdr ls))])
|
(let-values ([(lhs* rhs* arg*) (S* (cdr ls))])
|
||||||
(let ([a (car ls)])
|
(let ([a (car ls)])
|
||||||
(cond
|
(struct-case a
|
||||||
[(constant? a)
|
[(known expr type v)
|
||||||
|
(let ([tmp (unique-var 'tmp)])
|
||||||
|
(values (cons tmp lhs*)
|
||||||
|
(cons (V expr) rhs*)
|
||||||
|
(cons (make-known tmp type v) arg*)))]
|
||||||
|
[(constant i)
|
||||||
(values lhs* rhs* (cons a arg*))]
|
(values lhs* rhs* (cons a arg*))]
|
||||||
;[(var? a)
|
|
||||||
; (values lhs* rhs* (cons a arg*))]
|
|
||||||
[else
|
[else
|
||||||
(let ([t (unique-var 'tmp)])
|
(let ([t (unique-var 'tmp)])
|
||||||
(values (cons t lhs*) (cons (V a) rhs*) (cons t arg*)))])))]))
|
(values (cons t lhs*) (cons (V a) rhs*) (cons t arg*)))])))]))
|
||||||
|
@ -348,7 +351,13 @@
|
||||||
[(object? c) (error 'constant-rep "double-wrap")]
|
[(object? c) (error 'constant-rep "double-wrap")]
|
||||||
[else (make-constant (make-object c))])))
|
[else (make-constant (make-object c))])))
|
||||||
|
|
||||||
(define (V x)
|
(define (V x) ;;; erase known values
|
||||||
|
(struct-case x
|
||||||
|
[(known x type value)
|
||||||
|
(unknown-V x)]
|
||||||
|
[else (unknown-V x)]))
|
||||||
|
|
||||||
|
(define (unknown-V x)
|
||||||
(struct-case x
|
(struct-case x
|
||||||
[(constant) (constant-rep x)]
|
[(constant) (constant-rep x)]
|
||||||
[(var) x]
|
[(var) x]
|
||||||
|
@ -396,6 +405,9 @@
|
||||||
[(funcall) (prm '!= (V x) (V (K #f)))]
|
[(funcall) (prm '!= (V x) (V (K #f)))]
|
||||||
[(jmpcall) (prm '!= (V x) (V (K #f)))]
|
[(jmpcall) (prm '!= (V x) (V (K #f)))]
|
||||||
[(forcall) (prm '!= (V x) (V (K #f)))]
|
[(forcall) (prm '!= (V x) (V (K #f)))]
|
||||||
|
[(known expr type val)
|
||||||
|
;;; FIXME: suboptimal
|
||||||
|
(P expr)]
|
||||||
[else (error 'cogen-P "invalid pred expr" x)]))
|
[else (error 'cogen-P "invalid pred expr" x)]))
|
||||||
|
|
||||||
(define (E x)
|
(define (E x)
|
||||||
|
@ -421,6 +433,9 @@
|
||||||
(make-funcall (Function rator) (map V arg*))]
|
(make-funcall (Function rator) (map V arg*))]
|
||||||
[(jmpcall label rator arg*)
|
[(jmpcall label rator arg*)
|
||||||
(make-jmpcall label (V rator) (map V arg*))]
|
(make-jmpcall label (V rator) (map V arg*))]
|
||||||
|
[(known expr type val)
|
||||||
|
;;; FIXME: suboptimal
|
||||||
|
(E expr)]
|
||||||
[else (error 'cogen-E "invalid effect expr" x)]))
|
[else (error 'cogen-E "invalid effect expr" x)]))
|
||||||
|
|
||||||
(define (Function x)
|
(define (Function x)
|
||||||
|
@ -476,6 +491,7 @@
|
||||||
(struct-case x
|
(struct-case x
|
||||||
[(var) x]
|
[(var) x]
|
||||||
[(constant i) (constant-rep x)]
|
[(constant i) (constant-rep x)]
|
||||||
|
[(known expr type val) (T expr)]
|
||||||
[else (error 'cogen-T "invalid" (unparse x))]))
|
[else (error 'cogen-T "invalid" (unparse x))]))
|
||||||
|
|
||||||
(define (ClambdaCase x)
|
(define (ClambdaCase x)
|
||||||
|
|
Loading…
Reference in New Issue