~ chicken-core (chicken-5) 138b7cb0f82188e60bcaebe34334a1b8b8d89cad
commit 138b7cb0f82188e60bcaebe34334a1b8b8d89cad Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Jun 23 20:42:32 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Jun 23 20:42:32 2011 +0200 use proper id-generating syntax for predicate-specialization; rewalk specialized node to allow result to be specialized, yet retaining the result type) diff --git a/scrutinizer.scm b/scrutinizer.scm index b1198940..72a3e77b 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -485,7 +485,8 @@ (let* ((ptype (car args)) (pptype? (procedure-type? ptype)) (nargs (length (cdr args))) - (xptype `(procedure ,(make-list nargs '*) *))) + (xptype `(procedure ,(make-list nargs '*) *)) + (op #f)) (cond ((and (not pptype?) (not (match xptype ptype))) (report loc @@ -494,7 +495,7 @@ (pname) xptype ptype)) - '*) + (values '* #f)) (else (let-values (((atypes values-rest) (procedure-argument-types ptype nargs))) (d " argument-types: ~a (~a)" atypes values-rest) @@ -520,8 +521,7 @@ (set! noreturn #t)) (let ((r (procedure-result-types ptype values-rest (cdr args)))) ;;XXX we should check whether this is a standard- or extended binding - (let* ((pn (procedure-name ptype)) - (op #f)) + (let* ((pn (procedure-name ptype))) (when pn (cond ((and (fx= 1 nargs) (variable-mark pn '##compiler#predicate)) => @@ -535,7 +535,7 @@ (when specialize (specialize-node! node - `(let ((#:tmp #(1))) '#t)) + `(let ((#(tmp) #(1))) '#t)) (set! op (list pn pt)))) ((match-specialization (list `(not ,pt)) (cdr args) #t) (report-notice @@ -546,7 +546,7 @@ (when specialize (specialize-node! node - `(let ((#:tmp #(1))) '#f)) + `(let ((#(tmp) #(1))) '#f)) (set! op (list pt `(not ,pt)))))))) ((and specialize (variable-mark pn '##compiler#specializations)) => (lambda (specs) @@ -561,6 +561,7 @@ (when r2 (set! r r2))))) (else (loop (cdr specs)))))))) (when op + (d " specialized: `~s'" op) (cond ((assoc op specialization-statistics) => (lambda (a) (set-cdr! a (add1 (cdr a))))) (else @@ -571,8 +572,9 @@ (set-car! (node-parameters node) #t) (set! safe-calls (add1 safe-calls)))) (d " result-types: ~a" r) - r)))))) - + (values r op))))))) + + ;; not used in the moment (define (self-call? node loc) (case (node-class node) ((##core#call) @@ -799,43 +801,57 @@ (enforces (and pn (variable-mark pn '##compiler#enforce))) (pt (and pn (variable-mark pn '##compiler#predicate)))) - (let ((r (call-result n args e loc params))) - (for-each - (lambda (arg argr) - (when (eq? '##core#variable (node-class arg)) - (let* ((var (first (node-parameters arg))) - (a (assq var e)) - (oparg? (eq? arg (first subs))) - (pred (and pt ctags (not (get db var 'assigned)) (not oparg?)))) - (cond (pred - (d " predicate `~a' indicates `~a' is ~a in flow ~a" pn var pt - (car ctags)) - (add-to-blist - var (car ctags) - (if (and a (type<=? (cdr a) pt)) (cdr a) pt))) - (a - (when enforces - (let ((ar (cond ((blist-type var flow) => - (lambda (t) - (if (type<=? t argr) - t - argr))) - ((get db var 'assigned) '*) - ((type<=? (cdr a) argr) (cdr a)) - (else argr)))) - (d " assuming: ~a -> ~a (flow: ~a)" var ar (car flow)) - (add-to-blist var (car flow) ar) - (when ctags - (add-to-blist var (car ctags) ar) - (add-to-blist var (cdr ctags) ar))))) - ((and oparg? - (variable-mark var '##compiler#special-result-type)) - => (lambda (srt) - (dd " hardcoded special case: ~a" var) - (set! r (srt n r)))))))) - subs - (cons fn (nth-value 0 (procedure-argument-types fn (sub1 len))))) - r))) + (let-values (((r specialized?) (call-result n args e loc params))) + (cond (specialized? + (walk n e loc dest tail flow ctags) + ;; keep type, as the specialization may contain icky stuff + ;; like "##core#inline", etc. + r) + (else + (for-each + (lambda (arg argr) + (when (eq? '##core#variable (node-class arg)) + (let* ((var (first (node-parameters arg))) + (a (assq var e)) + (oparg? (eq? arg (first subs))) + (pred (and pt + ctags + (not (get db var 'assigned)) + (not oparg?)))) + (cond (pred + (d " predicate `~a' indicates `~a' is ~a in flow ~a" + pn var pt (car ctags)) + (add-to-blist + var (car ctags) + (if (and a (type<=? (cdr a) pt)) (cdr a) pt))) + (a + (when enforces + (let ((ar (cond ((blist-type var flow) => + (lambda (t) + (if (type<=? t argr) + t + argr))) + ((get db var 'assigned) '*) + ((type<=? (cdr a) argr) (cdr a)) + (else argr)))) + (d " assuming: ~a -> ~a (flow: ~a)" + var ar (car flow)) + (add-to-blist var (car flow) ar) + (when ctags + (add-to-blist var (car ctags) ar) + (add-to-blist var (cdr ctags) ar))))) + ((and oparg? + (variable-mark + var + '##compiler#special-result-type)) + => (lambda (srt) + (dd " hardcoded special case: ~a" var) + (set! r (srt n r)))))))) + subs + (cons + fn + (nth-value 0 (procedure-argument-types fn (sub1 len))))) + r))))) ((##core#the) (let-values (((t _) (validate-type (first params) #f))) (let ((rt (walk (first subs) e loc dest tail flow ctags)))Trap