>From 0c909da170e82eaca7e1255b7ba20b24945e84c3 Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Sun, 5 Feb 2012 22:54:34 +0100 Subject: [PATCH] While optimizing, don't traverse the same chain of replacable variables multiple times; update all variables encountered during traversal with the endpoint. --- optimizer.scm | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/optimizer.scm b/optimizer.scm index 72fbb20..30e4a2d 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -211,6 +211,15 @@ (else n1) ) ) ) ) ) + (define (replace-var var) + (cond ((test var 'replacable) => + (lambda (rvar) + (let ((final-var (replace-var rvar))) + ;; Store intermediate vars to avoid recurring same chain again + (put! db var 'replacable final-var) + final-var))) + (else var))) + (define (walk1 n fids gae) (let ((subs (node-subexpressions n)) (params (node-parameters n)) @@ -218,9 +227,8 @@ (case class ((##core#variable) - (let replace ((var (first params))) - (cond ((test var 'replacable) => replace) - ((test var 'collapsable) + (let ((var (replace-var (first params)))) + (cond ((test var 'collapsable) (touch) (debugging 'o "substituted constant variable" var) (qnode (car (node-parameters (test var 'value)))) ) -- 1.7.3.4