! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: kernel accessors sequences combinators fry
-classes.algebra namespaces assocs words math math.private
-math.partial-dispatch math.intervals classes classes.tuple
-classes.tuple.private layouts definitions stack-checker.dependencies
-stack-checker.branches
-compiler.utilities
-compiler.tree
-compiler.tree.combinators
-compiler.tree.propagation.info
-compiler.tree.propagation.branches ;
+USING: accessors classes classes.algebra combinators
+compiler.tree compiler.tree.combinators
+compiler.tree.propagation.branches
+compiler.tree.propagation.info compiler.utilities fry kernel
+layouts math math.intervals math.partial-dispatch math.private
+namespaces sequences stack-checker.branches
+stack-checker.dependencies words ;
IN: compiler.tree.cleanup
-! A phase run after propagation to finish the job, so to speak.
-! Codifies speculative inlining decisions, deletes branches
-! marked as never taken, and flattens local recursive blocks
-! that do not call themselves.
-
GENERIC: delete-node ( node -- )
M: #call-recursive delete-node
- dup label>> calls>> [ node>> eq? not ] with filter! drop ;
+ dup label>> calls>> [ node>> eq? ] with reject! drop ;
M: #return-recursive delete-node
label>> f >>return drop ;
: record-predicate-folding ( #call -- )
>predicate-folding< pick literal?>>
- [ [ literal>> ] 2dip depends-on-instance-predicate ]
- [ [ class>> ] 2dip depends-on-class-predicate ]
+ [ [ literal>> ] 2dip add-depends-on-instance-predicate ]
+ [ [ class>> ] 2dip add-depends-on-class-predicate ]
if ;
: record-folding ( #call -- )
dup word>> predicate?
[ record-predicate-folding ]
- [ word>> depends-on-definition ]
+ [ word>> add-depends-on-definition ]
if ;
: cleanup-folding ( #call -- nodes )
! Method inlining
: add-method-dependency ( #call -- )
dup method>> word? [
- [ [ class>> ] [ word>> ] bi depends-on-generic ]
- [ [ class>> ] [ word>> ] [ method>> ] tri depends-on-method ]
+ [ [ class>> ] [ word>> ] bi add-depends-on-generic ]
+ [ [ class>> ] [ word>> ] [ method>> ] tri add-depends-on-method ]
bi
] [ drop ] if ;
: record-inlining ( #call -- )
dup method>>
[ add-method-dependency ]
- [ word>> depends-on-definition ] if ;
+ [ word>> add-depends-on-definition ] if ;
: cleanup-inlining ( #call -- nodes )
[ record-inlining ] [ body>> cleanup ] bi ;