30 lines
899 B
Factor
30 lines
899 B
Factor
! Copyright (C) 2009 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors combinators.short-circuit kernel sequences vectors
|
|
compiler.cfg.instructions compiler.cfg.rpo compiler.cfg ;
|
|
IN: compiler.cfg.branch-folding
|
|
|
|
! Fold comparisons where both inputs are the same. Predecessors must be
|
|
! recomputed after this
|
|
|
|
: fold-branch? ( bb -- ? )
|
|
instructions>> last {
|
|
[ ##compare-branch? ]
|
|
[ [ src1>> ] [ src2>> ] bi = ]
|
|
} 1&& ;
|
|
|
|
: chosen-successor ( bb -- succ )
|
|
[ instructions>> last cc>> { cc= cc<= cc>= } memq? 0 1 ? ]
|
|
[ successors>> ]
|
|
bi nth ;
|
|
|
|
: fold-branch ( bb -- )
|
|
dup chosen-successor 1vector >>successors
|
|
instructions>> [ pop* ] [ [ \ ##branch new-insn ] dip push ] bi ;
|
|
|
|
: fold-branches ( cfg -- cfg' )
|
|
dup [
|
|
dup fold-branch?
|
|
[ fold-branch ] [ drop ] if
|
|
] each-basic-block
|
|
cfg-changed ; |