factor/basis/compiler/cfg/linearization/linearization.factor

69 lines
2.0 KiB
Factor
Raw Normal View History

2008-09-11 03:05:22 -04:00
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math accessors sequences namespaces make
2008-09-15 02:54:48 -04:00
combinators
compiler.cfg
compiler.cfg.rpo
compiler.cfg.instructions
compiler.cfg.instructions.syntax ;
2008-09-11 03:05:22 -04:00
IN: compiler.cfg.linearization
! Convert CFG IR to machine IR.
GENERIC: linearize-insn ( basic-block insn -- )
: linearize-insns ( basic-block -- )
dup instructions>> [ linearize-insn ] with each ; inline
M: insn linearize-insn , drop ;
: useless-branch? ( basic-block successor -- ? )
#! If our successor immediately follows us in RPO, then we
#! don't need to branch.
[ number>> 1+ ] [ number>> ] bi* = ; inline
: branch-to-return? ( successor -- ? )
#! A branch to a block containing just a return is cloned.
instructions>> dup length 2 = [
2008-09-17 01:46:38 -04:00
[ first ##epilogue? ] [ second ##return? ] bi and
2008-09-11 03:05:22 -04:00
] [ drop f ] if ;
: emit-branch ( basic-block successor -- )
{
{ [ 2dup useless-branch? ] [ 2drop ] }
{ [ dup branch-to-return? ] [ nip linearize-insns ] }
2008-09-17 01:46:38 -04:00
[ nip number>> _branch ]
2008-09-11 03:05:22 -04:00
} cond ;
2008-09-17 01:46:38 -04:00
M: ##branch linearize-insn
2008-09-11 03:05:22 -04:00
drop dup successors>> first emit-branch ;
: conditional ( basic-block -- basic-block successor1 label2 )
2008-09-17 01:46:38 -04:00
dup successors>> first2 swap number>> ; inline
2008-09-11 03:05:22 -04:00
: boolean-conditional ( basic-block insn -- basic-block successor vreg label2 )
2008-09-15 05:22:12 -04:00
[ conditional ] [ src>> ] bi* swap ; inline
2008-09-11 03:05:22 -04:00
2008-09-17 01:46:38 -04:00
M: ##branch-f linearize-insn
2008-09-11 03:05:22 -04:00
boolean-conditional _branch-f emit-branch ;
2008-09-17 01:46:38 -04:00
M: ##branch-t linearize-insn
2008-09-11 03:05:22 -04:00
boolean-conditional _branch-t emit-branch ;
2008-09-17 01:46:38 -04:00
: >intrinsic< ( insn -- quot defs uses )
[ quot>> ] [ defs-vregs>> ] [ uses-vregs>> ] tri ;
2008-09-11 03:05:22 -04:00
2008-09-17 01:46:38 -04:00
M: ##if-intrinsic linearize-insn
[ conditional ] [ >intrinsic< ] bi*
_if-intrinsic emit-branch ;
2008-09-11 03:05:22 -04:00
: linearize-basic-block ( bb -- )
2008-09-17 01:46:38 -04:00
[ number>> _label ] [ linearize-insns ] bi ;
2008-09-11 03:05:22 -04:00
: linearize-basic-blocks ( rpo -- insns )
[ [ linearize-basic-block ] each ] { } make ;
: build-mr ( cfg -- mr )
[ entry>> reverse-post-order linearize-basic-blocks ]
[ word>> ] [ label>> ]
tri <mr> ;