2005-08-11 19:08:22 -04:00
|
|
|
IN: inference
|
|
|
|
USING: kernel sequences words ;
|
|
|
|
|
|
|
|
! #ifte --> X
|
|
|
|
! |
|
|
|
|
! +--> Y
|
|
|
|
! |
|
|
|
|
! +--> Z
|
|
|
|
|
|
|
|
! Becomes:
|
|
|
|
|
|
|
|
! #ifte
|
|
|
|
! |
|
|
|
|
! +--> Y --> X
|
|
|
|
! |
|
|
|
|
! +--> Z --> X
|
|
|
|
|
|
|
|
GENERIC: split-node* ( node -- )
|
|
|
|
|
|
|
|
: split-node ( node -- )
|
|
|
|
[ dup split-node* node-successor split-node ] when* ;
|
|
|
|
|
|
|
|
M: node split-node* ( node -- ) drop ;
|
|
|
|
|
|
|
|
: split-branch ( node -- )
|
|
|
|
dup node-successor over node-children [
|
|
|
|
[ last-node >r clone-node r> set-node-successor ] keep
|
|
|
|
split-node
|
|
|
|
] each-with f swap set-node-successor ;
|
|
|
|
|
|
|
|
M: #ifte split-node* ( node -- )
|
|
|
|
split-branch ;
|
|
|
|
|
|
|
|
M: #dispatch split-node* ( node -- )
|
|
|
|
split-branch ;
|
|
|
|
|
|
|
|
M: #label split-node* ( node -- )
|
|
|
|
node-children first split-node ;
|
|
|
|
|
2005-08-12 23:54:29 -04:00
|
|
|
: post-inline ( #return/#values #call/#merge -- )
|
|
|
|
[ >r node-in-d r> node-out-d unify-length ] keep
|
|
|
|
node-successor subst-values ;
|
2005-08-11 19:08:22 -04:00
|
|
|
|
|
|
|
: subst-node ( old new -- )
|
2005-08-12 23:54:29 -04:00
|
|
|
[ last-node 2dup swap post-inline set-node-successor ] keep
|
|
|
|
split-node ;
|
2005-08-11 19:08:22 -04:00
|
|
|
|
|
|
|
: inline-literals ( node literals -- node )
|
|
|
|
#! Make #push -> #return -> successor
|
|
|
|
over drop-inputs [
|
2005-08-12 23:54:29 -04:00
|
|
|
>r [ literalize ] map dataflow [ subst-node ] keep
|
2005-08-11 19:08:22 -04:00
|
|
|
r> set-node-successor
|
|
|
|
] keep ;
|