~ chicken-core (chicken-5) 1ec315982093f39a7945fabb00a2daf1aa23189c
commit 1ec315982093f39a7945fabb00a2daf1aa23189c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Sep 6 20:30:53 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Sep 6 20:30:53 2010 +0200 cfolding done via apply diff --git a/compiler-namespace.scm b/compiler-namespace.scm index 91c1ecff..7fdc13d7 100644 --- a/compiler-namespace.scm +++ b/compiler-namespace.scm @@ -59,6 +59,7 @@ compiler-syntax-enabled compiler-syntax-statistics compute-database-statistics + constant-form-eval constant-table constant? constants-used diff --git a/optimizer.scm b/optimizer.scm index 0b225971..06b150a9 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -167,7 +167,7 @@ (subs (node-subexpressions n1)) ) (case (node-class n1) - ((if) ; (This can be done by the simplificator...) + ((if) ; (This can be done by the simplifier...) (cond ((constant-node? (car subs)) (set! removed-ifs (+ removed-ifs 1)) (touch) @@ -183,20 +183,24 @@ (if (and (intrinsic? var) (foldable? var) (every constant-node? (cddr subs)) ) - (let ((form (cons var (map (lambda (arg) `(quote ,(node-value arg))) - (cddr subs) ) ) ) ) - (handle-exceptions ex - (begin - (unless odirty (set! dirty #f)) - (set! broken-constant-nodes (lset-adjoin eq? broken-constant-nodes n1)) - n1) - (let ((x (eval form))) - (debugging 'o "folding constant expression" form) - (touch) - (make-node ; Build call to continuation with new result... - '##core#call - '(#t) - (list (cadr subs) (qnode x)) ) ) ) ) + (constant-form-eval + var + (cddr subs) + (lambda (ok form result) + (cond ((not ok) + (unless odirty (set! dirty #f)) + (set! broken-constant-nodes + (lset-adjoin eq? broken-constant-nodes n1)) + n1) + (else + (touch) + ;; Build call to continuation with new result... + (let ((n2 (qnode result))) + (register-cfold var (cddr subs) form n2) + (make-node + '##core#call + '(#t) + (list (cadr subs) n2) ) ) ) ))) n1) ) n1) ) diff --git a/support.scm b/support.scm index 43bd2444..2edaeebe 100644 --- a/support.scm +++ b/support.scm @@ -451,6 +451,9 @@ (parameters node-parameters node-parameters-set!) ; (value...) (subexpressions node-subexpressions node-subexpressions-set!)) ; (node...) +(define-record-printer (node n out) + (fprintf out "#<node ~a>" (node-class n))) + (define (make-node c p s) (##sys#make-structure 'node c p s) ) ; this kludge is for allowing the inlined `make-node' @@ -1389,11 +1392,23 @@ EOF (and info (->string info)))) -;;; We need this for constant folding: +;;; constant folding support: (define (string-null? x) (##core#inline "C_i_string_null_p" s)) +(define (constant-form-eval op argnodes k) + (let* ((args (map (lambda (n) (first (node-parameters n))) argnodes)) + (form (cons op (map (lambda (arg) `(quote ,arg)) args)))) + (handle-exceptions ex + (begin + (debugging 'o "folding constant expression failed" form) + (k #f form #f)) + ;; op must have toplevel binding, result must be single-valued + (let ((result (apply (##sys#slot op 0) args))) + (debugging 'o "folded constant expression" form) + (k #t form result))))) + ;;; Dump node structure:Trap