X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fcopyprop.lisp;h=eefacbdd397e18ecdd76294f5ebc8b162e2d4a3f;hb=1d46d379bb7a6424524b978f213ef69be5f1ad69;hp=f7062cadf4d39fd22ecba8bf96844b929914e90a;hpb=416152f084604094445a758ff399871132dff2bd;p=sbcl.git diff --git a/src/compiler/copyprop.lisp b/src/compiler/copyprop.lisp index f7062ca..eefacbd 100644 --- a/src/compiler/copyprop.lisp +++ b/src/compiler/copyprop.lisp @@ -55,8 +55,8 @@ ;;; The TN must be a :NORMAL TN. Other TNs might have hidden ;;; references or be otherwise bizarre. ;;; -;;; A TN is also inelegible if it has interned name, policy is such -;;; that we would dump it in the debug vars, and speed is not 3. +;;; A TN is also inelegible if we want to preserve it to facilitate +;;; debugging. ;;; ;;; The SCs of the TN's primitive types is a subset of the SCs of the ;;; copied TN. Moves between TNs of different primitive type SCs may @@ -84,9 +84,17 @@ (tn-primitive-type arg-tn))) (let ((leaf (tn-leaf tn))) (or (not leaf) - (not (symbol-package (leaf-name leaf))) - (policy (vop-node vop) - (or (= speed 3) (< debug 2))))) + (and + ;; Do we not care about preserving this this + ;; TN for debugging? + (or + (not (symbol-package (leaf-debug-name leaf))) + (policy (vop-node vop) + (or (= speed 3) (< debug 2)))) + ;; arguments of local functions have hidden write + (not (and (lambda-var-p leaf) + (memq (functional-kind (lambda-var-home leaf)) + '(nil :optional))))))) arg-tn))))))) ;;; Init the sets in BLOCK for copy propagation. To find GEN, we just @@ -105,8 +113,9 @@ (when (tn-is-copy-of y) (sset-adjoin y gen) t))) + ;; WANTED: explanation of UNLESS above. (do ((res (vop-results vop) (tn-ref-across res))) - ((null res)) + ((not res)) (let ((res-tn (tn-ref-tn res))) (do ((read (tn-reads res-tn) (tn-ref-next read))) ((null read)) @@ -116,9 +125,8 @@ (when (tn-is-copy-of y) (sset-delete y gen) (sset-adjoin y kill)))))))))) - (setf (block-out block) (copy-sset gen)) - (setf (block-kill-sset block) kill) + (setf (block-kill block) kill) (setf (block-gen block) gen)) (values)) @@ -135,7 +143,7 @@ (setf (block-in block) in) (sset-union-of-difference (block-out block) in - (block-kill-sset block)))) + (block-kill block)))) (defevent copy-deleted-move "Copy propagation deleted a move.")