From 8cb0dd1b20c9c64bf3d5d28ce165e0651e95b9fe Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 17 Jan 2019 13:24:16 -0500 Subject: [PATCH] Issue #293 - Added adbf:vars-mutated-by-set --- scheme/cyclone/cps-optimizations.sld | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/scheme/cyclone/cps-optimizations.sld b/scheme/cyclone/cps-optimizations.sld index 39acda8f..6dc13f8f 100644 --- a/scheme/cyclone/cps-optimizations.sld +++ b/scheme/cyclone/cps-optimizations.sld @@ -105,6 +105,8 @@ adbf:closure-size adbf:set-closure-size! adbf:self-closure-index adbf:set-self-closure-index! adbf:calls-self? adbf:set-calls-self! + adbf:vars-mutated-by-set + adbf:set-vars-mutated-by-set! with-fnc with-fnc! ) @@ -257,6 +259,7 @@ closure-size self-closure-index calls-self + vars-mutated-by-set ) adb:function? (simple adbf:simple adbf:set-simple!) @@ -278,6 +281,8 @@ (self-closure-index adbf:self-closure-index adbf:set-self-closure-index!) ;; Does this function call itself? (calls-self adbf:calls-self? adbf:set-calls-self!) + ;; Variables this function mutates via (set!) + (vars-mutated-by-set adbf:vars-mutated-by-set adbf:set-vars-mutated-by-set!) ) (define (adb:make-fnc) (%adb:make-fnc @@ -291,6 +296,7 @@ -1 ;; closure-size -1 ;; self-closure-index #f ;; calls-self + '() ;; vars-mutated-by-set )) ;; A constant value that cannot be mutated @@ -560,7 +566,17 @@ (for-each (lambda (expr) (analyze expr scope-sym id)) - (ast:lambda-body exp)))) + (ast:lambda-body exp)) + ;; Keep track of mutations made by child lambda's + (when (> lid 0) + (with-fnc id (lambda (inner-fnc) + (let ((vars-set (adbf:vars-mutated-by-set inner-fnc))) + (when (pair? vars-set) + (with-fnc! lid (lambda (outer-fnc) + (adbf:set-vars-mutated-by-set! + outer-fnc + (append vars-set (adbf:vars-mutated-by-set outer-fnc)))))))))) + )) ((const? exp) #f) ((quote? exp) #f) ((ref? exp) @@ -579,6 +595,11 @@ (adbv:set-const-value! var #f))) (analyze (define->exp exp) (define->var exp) lid)) ((set!? exp) + (when (ref? (set!->var exp)) + (with-fnc! lid (lambda (fnc) + (adbf:set-vars-mutated-by-set! + fnc + (cons (set!->var exp) (adbf:vars-mutated-by-set fnc)))))) ;(let ((var (adb:get/default (set!->var exp) (adb:make-var)))) (with-var! (set!->var exp) (lambda (var) (if (adbv:assigned-value var)