accessors vectors combinators sets classes compiler.cfg
compiler.cfg.registers compiler.cfg.instructions
compiler.cfg.copy-prop compiler.cfg.rpo
-compiler.cfg.liveness ;
+compiler.cfg.liveness compiler.cfg.local ;
IN: compiler.cfg.alias-analysis
! We try to eliminate redundant slot operations using some simple heuristics.
compute-liveness
[ entry>> live-in assoc-empty? [ bad-live-in ] unless ]
[ [ check-basic-block ] each-basic-block ]
- [ build-mr check-mr ]
+ [ flatten-cfg check-mr ]
tri ;
compiler.cfg.builder compiler.cfg.linearization
compiler.cfg.registers compiler.cfg.stack-frame
compiler.cfg.linear-scan compiler.cfg.two-operand
-compiler.cfg.optimizer ;
+compiler.cfg.liveness compiler.cfg.optimizer
+compiler.cfg.mr ;
IN: compiler.cfg.debugger
GENERIC: test-cfg ( quot -- cfgs )
M: word test-cfg
[ build-tree optimize-tree ] keep build-cfg ;
-SYMBOL: allocate-registers?
-
: test-mr ( quot -- mrs )
test-cfg [
optimize-cfg
- convert-two-operand
- allocate-registers? get [ linear-scan ] when
build-mr
- allocate-registers? get [ build-stack-frame ] when
] map ;
: insn. ( insn -- )
- tuple>array allocate-registers? get [ but-last ] unless
- [ pprint bl ] each nl ;
+ tuple>array [ pprint bl ] each nl ;
: mr. ( mrs -- )
[
M: _conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
M: _compare-imm-branch uses-vregs src1>> 1array ;
M: _dispatch uses-vregs src>> 1array ;
+M: _gc uses-vregs live-in>> ;
M: insn uses-vregs drop f ;
! Instructions that use vregs
##compare-imm-branch
_conditional-branch
_compare-imm-branch
-_dispatch ;
+_dispatch
+_gc ;
--- /dev/null
+Slava Pestov
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel sequences assocs
+cpu.architecture compiler.cfg.rpo
+compiler.cfg.liveness compiler.cfg.instructions ;
+IN: compiler.cfg.gc-checks
+
+: gc? ( bb -- ? )
+ instructions>> [ ##allocation? ] any? ;
+
+: object-pointer-regs ( basic-block -- vregs )
+ live-in keys [ reg-class>> int-regs eq? ] filter ;
+
+: insert-gc-check ( basic-block -- )
+ dup gc? [
+ dup
+ [ swap object-pointer-regs \ _gc new-insn suffix ]
+ change-instructions drop
+ ] [ drop ] if ;
+
+: insert-gc-checks ( cfg -- cfg' )
+ dup [ insert-gc-check ] each-basic-block ;
\ No newline at end of file
! See http://factorcode.org/license.txt for BSD license.
USING: accessors math namespaces sequences kernel fry
compiler.cfg compiler.cfg.registers compiler.cfg.instructions
-compiler.cfg.liveness ;
+compiler.cfg.liveness compiler.cfg.local ;
IN: compiler.cfg.height
! Combine multiple stack height changes into one at the
! Convert CFG IR to machine IR.
GENERIC: linearize-insn ( basic-block insn -- )
-: linearize-insns ( bb insns -- )
- dup instructions>> [ linearize-insn ] with each ;
-
-: gc? ( bb -- ? )
- instructions>> [ ##allocation? ] any? ;
-
-: object-pointer-regs ( basic-block -- vregs )
- live-in keys [ reg-class>> int-regs eq? ] filter ;
-
: linearize-basic-block ( bb -- )
[ number>> _label ]
- [ dup gc? [ object-pointer-regs _gc ] [ drop ] if ]
- [ linearize-insns ]
- tri ;
+ [ dup instructions>> [ linearize-insn ] with each ]
+ bi ;
M: insn linearize-insn , drop ;
bi
] { } make ;
-: build-mr ( cfg -- mr )
+: flatten-cfg ( cfg -- mr )
[ linearize-basic-blocks ] [ word>> ] [ label>> ] tri
<mr> ;
H{ } clone live-outs set
dup post-order add-to-work-list
work-list get [ liveness-step ] slurp-deque ;
-
-: local-optimization ( cfg init-quot: ( live-in -- ) insn-quot: ( insns -- insns' ) -- cfg' )
- [ dup ] 2dip '[ _ _ optimize-basic-block ] each-basic-block ;
\ No newline at end of file
--- /dev/null
+Slava Pestov
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: fry accessors kernel assocs compiler.cfg.liveness compiler.cfg.rpo ;
+IN: compiler.cfg.local
+
+: optimize-basic-block ( bb init-quot insn-quot -- )
+ [ '[ live-in keys @ ] ] [ '[ _ change-instructions drop ] ] bi* bi ; inline
+
+: local-optimization ( cfg init-quot: ( live-in -- ) insn-quot: ( insns -- insns' ) -- cfg' )
+ [ dup ] 2dip '[ _ _ optimize-basic-block ] each-basic-block ;
--- /dev/null
+Slava Pestov
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: compiler.cfg.linearization compiler.cfg.two-operand
+compiler.cfg.liveness compiler.cfg.gc-checks compiler.cfg.linear-scan
+compiler.cfg.stack-frame compiler.cfg.rpo ;
+IN: compiler.cfg.mr
+
+: build-mr ( cfg -- mr )
+ convert-two-operand
+ compute-liveness
+ insert-gc-checks
+ linear-scan
+ flatten-cfg
+ build-stack-frame ;
\ No newline at end of file
: each-basic-block ( cfg quot -- )
[ reverse-post-order ] dip each ; inline
-
-: optimize-basic-block ( bb init-quot insn-quot -- )
- [ '[ live-in keys @ ] ] [ '[ _ change-instructions drop ] ] bi* bi ; inline
dup check-for-redundant-ops ;
: linearize ( cfg -- mr )
- build-mr instructions>> ;
+ flatten-cfg instructions>> ;
[ ] [ [ ] test-stack-analysis drop ] unit-test
##compare-imm-branch
##dispatch ;
+SYMBOL: local-only?
+
+t local-only? set-global
+
M: sync-if-back-edge visit
basic-block get [ successors>> ] [ number>> ] bi
- '[ number>> _ < ] any?
+ '[ number>> _ < local-only? get or ] any?
[ sync-state ] when
, ;
! See http://factorcode.org/license.txt for BSD license.
USING: namespaces assocs biassocs classes kernel math accessors
sorting sets sequences
+compiler.cfg.local
compiler.cfg.liveness
compiler.cfg.value-numbering.graph
compiler.cfg.value-numbering.expressions
! See http://factorcode.org/license.txt for BSD license.
USING: kernel accessors namespaces assocs sets sequences locals
compiler.cfg compiler.cfg.instructions compiler.cfg.copy-prop
-compiler.cfg.liveness ;
+compiler.cfg.liveness compiler.cfg.local ;
IN: compiler.cfg.write-barrier
! Eliminate redundant write barrier hits.
USING: accessors kernel namespaces arrays sequences io words fry
continuations vocabs assocs dlists definitions math graphs generic
generic.single combinators deques search-deques macros
-source-files.errors stack-checker stack-checker.state
-stack-checker.inlining stack-checker.errors combinators.short-circuit
-compiler.errors compiler.units compiler.tree.builder
-compiler.tree.optimizer compiler.cfg.builder compiler.cfg.optimizer
-compiler.cfg.linearization compiler.cfg.two-operand
-compiler.cfg.linear-scan compiler.cfg.stack-frame compiler.cfg.rpo
-compiler.codegen compiler.utilities ;
+source-files.errors combinators.short-circuit
+
+stack-checker stack-checker.state stack-checker.inlining stack-checker.errors
+
+compiler.errors compiler.units compiler.utilities
+
+compiler.tree.builder
+compiler.tree.optimizer
+
+compiler.cfg.builder
+compiler.cfg.optimizer
+compiler.cfg.mr
+
+compiler.codegen ;
IN: compiler
SYMBOL: compile-queue
: backend ( nodes word -- )
build-cfg [
optimize-cfg
- convert-two-operand
- linear-scan
build-mr
- build-stack-frame
generate
save-asm
] each ;