factor/basis/compiler/cfg/branch-splitting/branch-splitting.factor

30 lines
896 B
Factor

! Copyright (C) 2009 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors combinators.short-circuit compiler.cfg.def-use
compiler.cfg.rpo kernel math sequences ;
IN: compiler.cfg.branch-splitting
: split-branch ( branch -- )
[
[ instructions>> ] [ predecessors>> ] bi [
instructions>> [ pop* ] [ push-all ] bi
] with each
] [
[ successors>> ] [ predecessors>> ] bi [
[ drop clone ] change-successors drop
] with each
] bi ;
: split-branches? ( bb -- ? )
{
[ predecessors>> length 1 >= ]
[ successors>> length 1 <= ]
[ instructions>> [ defs-vregs ] any? not ]
[ instructions>> [ temp-vregs ] any? not ]
} 1&& ;
: split-branches ( cfg -- cfg' )
dup [
dup split-branches? [ split-branch ] [ drop ] if
] each-basic-block f >>post-order ;