anchor.diff:  
   ;;----------------------------------------------------------------------
   
  +(defun post-process-ast (post-proc-obj)
  +  (declare (optimize (debug 3) (speed 0)))
  +  (let ((flow-origin-map (make-hash-table))
  +	(val-origin-map (make-hash-table))
  +	(node-copy-map (make-hash-table :test #'eq)))
  +    ;; prime maps with args (env)
  +    ;; {TODO} need to prime in-args & structs/array elements
  +    (labels ((uniform-raw (val)
  +	       (slot-value (first (ids (first (listify (flow-ids val)))))
  +			   'val)))
  +      (let ((env (%get-base-env (env post-proc-obj))))
  +	(loop :for (name % %1) :in (v-uniforms env) :do
  +	   (let ((key (uniform-raw (get-var name env)))
  +		 (val (vector :uniform name)))
  +	     (setf (gethash key flow-origin-map) val)
  +	     (setf (gethash key val-origin-map) val)))))
  +
  +    (labels ((post-process-node (node walk parent &key replace-args)
  +	       ;; we want a new copy as we will be mutating it
  +	       (let ((new (copy-ast-node
  +			   node
  +			   :flow-id (ast-flow-id node)
  +			   :parent (gethash parent node-copy-map))))
  +		 ;; store the lookup tables with every node
  +		 (setf (slot-value new 'flow-id-origins) flow-origin-map
  +		       (slot-value new 'val-origins) val-origin-map)
  +		 (with-slots (args val-origin flow-id-origin kind) new
  +		   ;;    maintain the relationship between this copied
  +		   ;;    node and the original
  +		   (setf (gethash node node-copy-map) new
  +			 ;; walk the args. OR, if the caller pass it,
  +			 ;; walk the replacement args and store them instead
  +			 args (mapcar λ(funcall walk _ :parent node)
  +				      (or replace-args (ast-args node)))
  +			 ;;
  +			 val-origin (val-origins new)
  +			 ;;
  +			 flow-id-origin (flow-id-origins new))
  +		   ;;
  +		   (when (typep (ast-kind new) 'v-function)
  +		     (setf kind (name (ast-kind new)))))
  +		 new))
  +
  +	     (walk-node (node walk &key parent)
  +	       (cond
  +		 ;; remove progns with one form
  +		 ((and (ast-kindp node 'progn) (= (length (ast-args node)) 1))
  +		  (funcall walk (first (ast-args node)) :parent parent))
  +
  +		 ;; splice progns into let's implicit progn
  +		 ((ast-kindp node 'let)
  +		  (let ((args (ast-args node)))
  +		    (post-process-node
  +		     node walk parent :replace-args
  +		     `(,(first args)
  +			,@(loop :for a :in (rest args)
  +			     :if (and (typep a 'ast-node)
  +				      (ast-kindp a 'progn))
  +			     :append (ast-args a)
  +			     :else :collect a)))))
  +
  +		 ;; remove %return nodes
  +		 ((ast-kindp node '%return)
  +		  (funcall walk (first (ast-args node)) :parent parent))
  +
  +		 (t (post-process-node node walk parent)))))
  +
  +      (symbol-macrolet ((code (code post-proc-obj)))
  +	(let ((ast (walk-ast #'walk-node code :include-parent t)))
  +	  (setf code (copy-code code :node-tree ast)
  +		(slot-value post-proc-obj 'ast) ast)))
  +
  +      post-proc-obj)))
  +
  +;;----------------------------------------------------------------------
  +
  +(defun filter-used-items (post-proc-obj)
  +  "This changes the code-object so that used-types only contains used
  +   'user' defined structs."
  +  (with-slots (code env) post-proc-obj
  +    (setf (used-types post-proc-obj)
  +	  (loop :for i :in (find-used-user-structs code env)
  +	     :collect (type-spec->type i :env env))))
  +  post-proc-obj)
  +
  +;;----------------------------------------------------------------------
  +
   (defun calc-locations (types)
   ;;   "Takes a list of type objects and returns a list of positions
   ;; - usage example -
  
positive.code: 		 :used-symbol-macros (dedup-used (used-symbol-macros env))
  		 :used-macros (dedup-used (used-macros env))
  		 :used-compiler-macros (dedup-used (used-compiler-macros env))))
  
  ;;----------------------------------------------------------------------
  
  (defun filter-used-items (post-proc-obj)
    "This changes the code-object so that used-types only contains used
     'user' defined structs."
    (with-slots (code env) post-proc-obj
      (setf (used-types post-proc-obj)
  	  (loop :for i :in (find-used-user-structs code env)
  	     :collect (type-spec->type i :env env))))
    post-proc-obj)
  
  ;;----------------------------------------------------------------------
  
  
negative.code: 		#'compiler-macroexpand-pass)
  	#'compile-pass
  	#'make-post-process-obj
  	#'check-stemcells
  	#'post-process-ast
  	#'filter-used-items
  	#'gen-in-arg-strings
  	#'gen-out-var-strings
  	#'final-uniform-strings
  