From c7aa3700ead4a52ff64bd96f4878fedfee89d718 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 4 May 2017 05:11:46 +0000 Subject: [PATCH] Also identify pure functions using assigned-var This identifies cases where a pure function exits but is defined inline rather than at the top-level. --- scheme/cyclone/cps-optimizations.sld | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/scheme/cyclone/cps-optimizations.sld b/scheme/cyclone/cps-optimizations.sld index 54c95522..50f7c074 100644 --- a/scheme/cyclone/cps-optimizations.sld +++ b/scheme/cyclone/cps-optimizations.sld @@ -1075,11 +1075,18 @@ ;; Does ref refer to a pure function (no side effects)? (let ((var (adb:get/default (car exp) #f))) (if var - (let ((lid (adbv:defines-lambda-id var))) - (if lid - (with-fnc! lid (lambda (fnc) - (if (not (adbf:side-effects fnc)) - (set! pure-fnc #t)))))))) + (let ((lid (adbv:defines-lambda-id var)) + (assigned-val (adbv:assigned-value var))) + (cond + (lid + (with-fnc! lid (lambda (fnc) + (if (not (adbf:side-effects fnc)) + (set! pure-fnc #t))))) + ((ast:lambda? assigned-val) + (with-fnc! (ast:lambda-id assigned-val) (lambda (fnc) + (if (not (adbf:side-effects fnc)) + (set! pure-fnc #t))))) + )))) ;; (with-var (car exp) (lambda (var) (let ((val (adbv:assigned-value var)))