factor/library/inference/split-nodes.factor

63 lines
1.4 KiB
Factor
Raw Normal View History

2005-09-09 00:17:19 -04:00
IN: optimizer
2005-12-10 01:02:13 -05:00
USING: arrays inference kernel lists sequences words ;
2005-09-24 15:21:17 -04:00
! #if --> X
! |
! +--> Y
! |
! +--> Z
! Becomes:
2005-09-24 15:21:17 -04:00
! #if
! |
! +--> Y --> X
! |
! +--> Z --> X
2005-09-04 01:09:46 -04:00
GENERIC: split-node* ( node -- )
: split-node ( node -- )
[ dup split-node* node-successor split-node ] when* ;
M: node split-node* ( node -- ) drop ;
2005-08-13 04:01:21 -04:00
: post-inline ( #return/#values #call/#merge -- )
dup [
2005-12-10 01:02:13 -05:00
[
>r node-in-d r> node-out-d
2array unify-lengths first2
] keep node-successor subst-values
2005-08-13 04:01:21 -04:00
] [
2drop
2005-09-24 15:21:17 -04:00
] if ;
2005-08-13 04:01:21 -04:00
: subst-node ( old new -- )
#! The last node of 'new' becomes 'old', then values are
#! substituted. A subsequent optimizer phase kills the
#! last node of 'new' and the first node of 'old'.
[ last-node 2dup swap post-inline set-node-successor ] keep
split-node ;
: inline-literals ( node literals -- node )
#! Make #push -> #return -> successor
over drop-inputs [
2005-10-13 01:48:16 -04:00
>r >list [ literalize ] map dataflow [ subst-node ] keep
r> set-node-successor
] keep ;
: split-branch ( node -- )
2005-08-13 04:01:21 -04:00
dup node-successor over node-children
[ >r clone-node r> subst-node ] each-with
f swap set-node-successor ;
2005-09-24 15:21:17 -04:00
M: #if split-node* ( node -- )
split-branch ;
M: #dispatch split-node* ( node -- )
split-branch ;
2005-09-04 01:09:46 -04:00
! #label
M: #label split-node* ( node -- )
2005-09-04 01:09:46 -04:00
node-child split-node ;