From 1319d8e54997eeb5f4ceb522684acbc023024a28 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 26 Jul 2009 21:10:14 -0500 Subject: [PATCH] compiler.cfg.def-use: build def-use chains --- basis/compiler/cfg/def-use/def-use.factor | 57 ++++++++++++++++++++++- basis/compiler/cfg/ssa/ssa.factor | 15 +----- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/basis/compiler/cfg/def-use/def-use.factor b/basis/compiler/cfg/def-use/def-use.factor index 0f488de559..d4d6ce8289 100644 --- a/basis/compiler/cfg/def-use/def-use.factor +++ b/basis/compiler/cfg/def-use/def-use.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays kernel assocs sequences -sets compiler.cfg.instructions ; +USING: accessors arrays kernel assocs sequences namespaces fry +sets compiler.cfg.rpo compiler.cfg.instructions ; IN: compiler.cfg.def-use GENERIC: defs-vregs ( insn -- seq ) @@ -49,3 +49,56 @@ M: _conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ; M: _compare-imm-branch uses-vregs src1>> 1array ; M: _dispatch uses-vregs src>> 1array ; M: insn uses-vregs drop f ; + +! Computing def-use chains. We don't assume a program is in SSA form, +! since SSA construction itself needs def-use information. defs-1 +! is only useful if the program is SSA. +SYMBOLS: defs defs-1 insns uses ; + +: def-of ( vreg -- node ) defs-1 get at ; +: defs-of ( vreg -- nodes ) defs get at ; +: uses-of ( vreg -- nodes ) uses get at ; +: insn-of ( vreg -- insn ) insns get at ; + +> [ + @ [ + _ conjoin-at + ] with each + ] with each + ] each-basic-block + ] keep + [ keys ] assoc-map ; inline + +PRIVATE> + +: compute-defs ( cfg -- ) + [ defs-vregs ] (compute-def-use) + [ defs set ] [ [ first ] assoc-map defs-1 set ] bi ; + +: compute-uses ( cfg -- ) + [ uses-vregs ] (compute-def-use) uses set ; + +: compute-insns ( cfg -- ) + H{ } clone [ + '[ + instructions>> [ + dup defs-vregs [ + _ set-at + ] with each + ] each + ] each-basic-block + ] keep insns set ; + +: compute-def-use ( cfg -- ) + [ compute-defs ] [ compute-uses ] [ compute-insns ] tri ; \ No newline at end of file diff --git a/basis/compiler/cfg/ssa/ssa.factor b/basis/compiler/cfg/ssa/ssa.factor index 2e76ba35a1..97b8db8104 100644 --- a/basis/compiler/cfg/ssa/ssa.factor +++ b/basis/compiler/cfg/ssa/ssa.factor @@ -23,22 +23,9 @@ IN: compiler.cfg.ssa > [ - defs-vregs [ - _ conjoin-at - ] with each - ] with each - ] each-basic-block ; - : insert-phi-node-later ( vreg bb -- ) 2dup live-in key? [ [ predecessors>> over '[ _ ] H{ } map>assoc \ ##phi new-insn ] keep @@ -46,7 +33,7 @@ SYMBOL: inserting-phi-nodes ] [ 2drop ] if ; : compute-phi-nodes-for ( vreg bbs -- ) - keys dup length 2 >= [ + dup length 2 >= [ iterated-dom-frontier [ insert-phi-node-later ] with each