: (collect-copies) ( cfg -- )
[
phis get clear-assoc
- instructions>> [ visit-insn ] each
- ] each-basic-block ;
+ [ visit-insn ] each
+ ] simple-analysis ;
: collect-copies ( cfg -- )
H{ } clone copies set
compiler.units fry generalizations sequences.generalizations
generic kernel locals namespaces quotations sequences sets slots
words compiler.cfg.instructions compiler.cfg.instructions.syntax
-compiler.cfg.rpo ;
+compiler.cfg.rpo compiler.cfg ;
FROM: namespaces => set ;
FROM: sets => members ;
IN: compiler.cfg.def-use
: compute-defs ( cfg -- )
H{ } clone [
'[
- dup instructions>> [
+ [ basic-block get ] dip [
_ set-def-of
] with each
- ] each-basic-block
+ ] simple-analysis
] keep defs set ;
: compute-insns ( cfg -- )
H{ } clone [
'[
- instructions>> [
+ [
dup _ set-def-of
] each
- ] each-basic-block
+ ] simple-analysis
] keep insns set ;
} cleave ;
:: assign-registers-in-block ( bb -- )
- bb [
- [
- bb begin-block
+ bb kill-block?>> [
+ bb [
[
- {
- [ insn#>> 1 - prepare-insn ]
- [ insn#>> prepare-insn ]
- [ assign-registers-in-insn ]
- [ , ]
- } cleave
- ] each
- bb compute-live-out
- ] V{ } make
- ] change-instructions drop ;
+ bb begin-block
+ [
+ {
+ [ insn#>> 1 - prepare-insn ]
+ [ insn#>> prepare-insn ]
+ [ assign-registers-in-insn ]
+ [ , ]
+ } cleave
+ ] each
+ bb compute-live-out
+ ] V{ } make
+ ] change-instructions drop
+ ] unless ;
: assign-registers ( live-intervals cfg -- )
[ init-assignment ] dip
M: insn compute-sync-points* drop ;
: compute-live-intervals-step ( bb -- )
- {
- [ block-from from set ]
- [ block-to to set ]
- [ handle-live-out ]
- [
- instructions>> <reversed> [
- [ compute-live-intervals* ]
- [ compute-sync-points* ]
- bi
- ] each
- ]
- } cleave ;
+ dup kill-block?>> [ drop ] [
+ {
+ [ block-from from set ]
+ [ block-to to set ]
+ [ handle-live-out ]
+ [
+ instructions>> <reversed> [
+ [ compute-live-intervals* ]
+ [ compute-sync-points* ]
+ bi
+ ] each
+ ]
+ } cleave
+ ] if ;
: init-live-intervals ( -- )
H{ } clone live-intervals set
2dup compute-mappings perform-mappings ;
: resolve-block-data-flow ( bb -- )
- dup successors>> [ resolve-edge-data-flow ] with each ;
+ dup kill-block?>> [ drop ] [
+ dup successors>> [ resolve-edge-data-flow ] with each
+ ] if ;
: resolve-data-flow ( cfg -- )
needs-predecessors
: init-components ( cfg components -- )
'[
- instructions>> [
+ [
defs-vregs [ _ add-atom ] each
] each
- ] each-basic-block ;
+ ] simple-analysis ;
GENERIC# visit-insn 1 ( insn disjoint-set -- )
: merge-components ( cfg components -- )
'[
- instructions>> [
+ [
_ visit-insn
] each
- ] each-basic-block ;
+ ] simple-analysis ;
: compute-components ( cfg -- )
<disjoint-set>
! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors compiler.cfg.instructions compiler.cfg.registers
-compiler.cfg.rpo cpu.architecture kernel sequences vectors ;
+compiler.cfg.rpo cpu.architecture kernel sequences vectors
+combinators.short-circuit ;
IN: compiler.cfg.save-contexts
! Insert context saves.
M: insn needs-save-context? drop f ;
: bb-needs-save-context? ( insn -- ? )
- instructions>> [ needs-save-context? ] any? ;
+ {
+ [ kill-block?>> not ]
+ [ instructions>> [ needs-save-context? ] any? ]
+ } 1&& ;
GENERIC: modifies-context? ( insn -- ? )
[ dst>> ] [ inputs>> values ] bi
[ maybe-eliminate-copy ] with each ;
-: prepare-block ( bb -- )
- instructions>> [ prepare-insn ] each ;
-
: prepare-coalescing ( cfg -- )
init-coalescing
- [ prepare-block ] each-basic-block ;
+ [ [ prepare-insn ] each ] simple-analysis ;
: process-copies ( -- )
copies get [ maybe-eliminate-copy ] assoc-each ;
SYMBOLS: def-indices kill-indices ;
-: compute-local-live-ranges ( bb -- )
+: compute-local-live-ranges ( insns -- )
H{ } clone local-def-indices set
H{ } clone local-kill-indices set
- [ instructions>> [ swap record-insn ] each-index ]
- [ [ local-def-indices get ] dip def-indices get set-at ]
- [ [ local-kill-indices get ] dip kill-indices get set-at ]
- tri ;
+ [ swap record-insn ] each-index
+ local-def-indices get basic-block get def-indices get set-at
+ local-kill-indices get basic-block get kill-indices get set-at ;
PRIVATE>
H{ } clone def-indices set
H{ } clone kill-indices set
- [ compute-local-live-ranges ] each-basic-block ;
+ [ compute-local-live-ranges ] simple-analysis ;
: def-index ( vreg bb -- n )
def-indices get at at ;