From 5163ab5baf272b9415fcda684717178d921f6ba0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 17 Jan 2018 05:23:15 +0300 Subject: [PATCH] Maintain LAMBDA-CALLS-OR-CLOSES in DELETE-REF. Fixes lp#1743665 --- src/compiler/ir1util.lisp | 8 ++++++-- tests/compiler-2.pure.lisp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index a1d22d789..44348747d 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -1506,9 +1506,13 @@ (defun delete-ref (ref) (declare (type ref ref)) (let* ((leaf (ref-leaf ref)) - (refs (delq ref (leaf-refs leaf)))) + (refs (delq ref (leaf-refs leaf))) + (home (node-home-lambda ref))) (setf (leaf-refs leaf) refs) - + (when (and (typep leaf '(or clambda lambda-var)) + (not (find home refs :key #'node-home-lambda))) + ;; It was the last reference from this lambda, remove it + (sset-delete leaf (lambda-calls-or-closes home))) (cond ((null refs) (typecase leaf (lambda-var diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 01cd00c9b..55b36df41 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -1068,3 +1068,20 @@ (declare (dynamic-extent v)) (car v))) (() 1))) + +(with-test (:name (:delete-ref :maintain-lambda-calls-or-closes)) + (checked-compile `(lambda (c y) + (labels ((f1 () + (if y + (f3 2))) + (l () (loop)) + (f2 () + (l) + (f3 3)) + (f3 (x) + (f3 x)) + (f4 () + (f1) + (f2))) + (f4) + c)))) -- 2.11.4.GIT