(awhen (node-lvar node)
(lvar-dynamic-extent it)))
+(defun use-good-for-dx-p (use)
+ (and (combination-p use)
+ (eq (combination-kind use) :known)
+ (awhen (fun-info-stack-allocate-result
+ (combination-fun-info use))
+ (funcall it use))))
+
(declaim (inline block-to-be-deleted-p))
(defun block-to-be-deleted-p (block)
(or (block-delete-p block)
;;; of arguments changes, the transform must be prepared to return a
;;; lambda with a new lambda-list with the correct number of
;;; arguments.
-(defun extract-fun-args (lvar fun num-args)
+(defun splice-fun-args (lvar fun num-args)
#!+sb-doc
"If LVAR is a call to FUN with NUM-ARGS args, change those arguments
to feed directly to the LVAR-DEST of LVAR, which must be a
(flush-dest lvar)
(values))))))
+(defun extract-fun-args (lvar fun num-args)
+ (declare (type lvar lvar)
+ (type (or symbol list) fun)
+ (type index num-args))
+ (let ((fun (if (listp fun) fun (list fun))))
+ (let ((inside (lvar-uses lvar)))
+ (unless (combination-p inside)
+ (give-up-ir1-transform))
+ (let ((inside-fun (combination-fun inside)))
+ (unless (member (lvar-fun-name inside-fun) fun)
+ (give-up-ir1-transform))
+ (let ((inside-args (combination-args inside)))
+ (unless (= (length inside-args) num-args)
+ (give-up-ir1-transform))
+ (values (lvar-fun-name inside-fun) inside-args))))))
+
(defun flush-combination (combination)
(declare (type combination combination))
(flush-dest (combination-fun combination))
nil))
nil)))
+(defun lvar-fun-debug-name (lvar)
+ (declare (type lvar lvar))
+ (let ((uses (lvar-uses lvar)))
+ (flet ((name1 (use)
+ (leaf-debug-name (ref-leaf use))))
+ (if (ref-p uses)
+ (name1 uses)
+ (mapcar #'name1 uses)))))
+
;;; Return the source name of a combination. (This is an idiom
;;; which was used in CMU CL. I gather it always works. -- WHN)
(defun combination-fun-source-name (combination)
(setf (node-reoptimize node) t)
(setf (block-reoptimize (node-block node)) t)
(reoptimize-component (node-component node) :maybe)))))))
+
+;;; True if LVAR is for 'NAME, or #'NAME (global, not local)
+(defun lvar-for-named-function (lvar name)
+ (if (constant-lvar-p lvar)
+ (eq name (lvar-value lvar))
+ (let ((use (lvar-uses lvar)))
+ (and (not (listp use))
+ (ref-p use)
+ (let ((leaf (ref-leaf use)))
+ (and (global-var-p leaf)
+ (eq :global-function (global-var-kind leaf))
+ (eq name (leaf-source-name leaf))))))))