! Copyright (C) 2009 Slava Pestov. ! See https://factorcode.org/license.txt for BSD license. USING: accessors assocs combinators.short-circuit compiler.cfg.predecessors compiler.cfg.rpo compiler.cfg.utilities deques dlists functors kernel lexer namespaces sequences ; IN: compiler.cfg.dataflow-analysis GENERIC: join-sets ( sets bb dfa -- set ) GENERIC: transfer-set ( in-set bb dfa -- out-set ) GENERIC: block-order ( cfg dfa -- bbs ) GENERIC: successors ( bb dfa -- seq ) GENERIC: predecessors ( bb dfa -- seq ) GENERIC: ignore-block? ( bb dfa -- ? ) ( cfg dfa -- queue ) block-order [ push-all-front ] keep ; :: compute-in-set ( bb out-sets dfa -- set ) ! Only consider initialized sets. bb dfa ignore-block? [ f ] [ bb dfa predecessors [ out-sets key? ] filter [ out-sets at ] map bb dfa join-sets ] if ; :: update-in-set ( bb in-sets out-sets dfa -- ? ) bb out-sets dfa compute-in-set bb in-sets maybe-set-at ; inline :: compute-out-set ( bb in-sets dfa -- set ) bb dfa ignore-block? [ f ] [ bb in-sets at bb dfa transfer-set ] if ; :: update-out-set ( bb in-sets out-sets dfa -- ? ) bb in-sets dfa compute-out-set bb out-sets maybe-set-at ; inline : update-in/out-set ( bb in-sets out-sets dfa -- ? ) { [ update-in-set ] [ update-out-set ] } 4 n&& ; :: dfa-step ( bb in-sets out-sets dfa -- bbs ) bb in-sets out-sets dfa update-in/out-set bb dfa successors { } ? ; :: run-dataflow-analysis ( cfg dfa -- in-sets out-sets ) H{ } clone :> in-sets H{ } clone :> out-sets cfg needs-predecessors cfg dfa [ in-sets out-sets dfa dfa-step ] slurp/replenish-deque in-sets out-sets ; inline M: dataflow-analysis join-sets 2drop assoc-intersect-all ; M: dataflow-analysis ignore-block? drop kill-block?>> ; ! ! ! Forward dataflow analysis MIXIN: forward-analysis INSTANCE: forward-analysis dataflow-analysis M: forward-analysis block-order drop reverse-post-order ; M: forward-analysis successors drop successors>> ; M: forward-analysis predecessors drop predecessors>> ; ! ! ! Backward dataflow analysis MIXIN: backward-analysis INSTANCE: backward-analysis dataflow-analysis M: backward-analysis block-order drop post-order ; M: backward-analysis successors drop predecessors>> ; M: backward-analysis predecessors drop successors>> ; PRIVATE> SYNTAX: FORWARD-ANALYSIS: scan-token [ define-analysis ] [ define-forward-analysis ] bi ; SYNTAX: BACKWARD-ANALYSIS: scan-token [ define-analysis ] [ define-backward-analysis ] bi ;