FUNCTOR: define-analysis ( name -- )
-name-analysis DEFINES-CLASS ${name}-analysis
+name DEFINES-CLASS ${name}
name-ins DEFINES ${name}-ins
name-outs DEFINES ${name}-outs
name-in DEFINES ${name}-in
WHERE
-SINGLETON: name-analysis
+SINGLETON: name
SYMBOL: name-ins
FUNCTOR: define-forward-analysis ( name -- )
-name-analysis IS ${name}-analysis
+name IS ${name}
name-ins IS ${name}-ins
name-outs IS ${name}-outs
compute-name-sets DEFINES compute-${name}-sets
WHERE
-INSTANCE: name-analysis forward-analysis
+INSTANCE: name forward-analysis
: compute-name-sets ( cfg -- )
- name-analysis run-dataflow-analysis
+ name run-dataflow-analysis
[ name-ins set ] [ name-outs set ] bi* ;
;FUNCTOR
FUNCTOR: define-backward-analysis ( name -- )
-name-analysis IS ${name}-analysis
+name IS ${name}
name-ins IS ${name}-ins
name-outs IS ${name}-outs
compute-name-sets DEFINES compute-${name}-sets
WHERE
-INSTANCE: name-analysis backward-analysis
+INSTANCE: name backward-analysis
: compute-name-sets ( cfg -- )
- \ name-analysis run-dataflow-analysis
+ \ name run-dataflow-analysis
[ name-outs set ] [ name-ins set ] bi* ;
;FUNCTOR
! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: assocs combinators compiler.cfg.dataflow-analysis
-compiler.cfg.stacks.local kernel namespaces sequences sets ;
+USING: assocs compiler.cfg.dataflow-analysis compiler.cfg.stacks.local
+kernel namespaces sequences sets ;
IN: compiler.cfg.stacks.global
: peek-set ( bb -- assoc ) peek-sets get at ;
! before writing it.
BACKWARD-ANALYSIS: anticip
-M: anticip-analysis transfer-set drop transfer-peeked-locs ;
-M: anticip-analysis join-sets 2drop refine ;
+M: anticip transfer-set drop transfer-peeked-locs ;
+M: anticip join-sets 2drop refine ;
! A stack location is live at a location if some path from
! the location to an exit block will read the stack location
! before writing it.
BACKWARD-ANALYSIS: live
-M: live-analysis transfer-set drop transfer-peeked-locs ;
-M: live-analysis join-sets 2drop combine ;
+M: live transfer-set drop transfer-peeked-locs ;
+M: live join-sets 2drop combine ;
! A stack location is available at a location if all paths from
! the entry block to the location load the location into a
! register.
FORWARD-ANALYSIS: avail
-M: avail-analysis transfer-set
+M: avail transfer-set
drop [ peek-set ] [ replace-set ] bi union union ;
-M: avail-analysis join-sets 2drop refine ;
+M: avail join-sets 2drop refine ;
! A stack location is pending at a location if all paths from
! the entry block to the location write the location.
FORWARD-ANALYSIS: pending
-M: pending-analysis transfer-set
+M: pending transfer-set
drop replace-set union ;
-M: pending-analysis join-sets 2drop refine ;
+M: pending join-sets 2drop refine ;
! A stack location is dead at a location if no paths from the
! location to the exit block read the location before writing it.
BACKWARD-ANALYSIS: dead
-M: dead-analysis transfer-set
+M: dead transfer-set
drop [ kill-set ] [ replace-set ] bi union union ;
-M: dead-analysis join-sets 2drop refine ;
+M: dead join-sets 2drop refine ;
: visit-insns ( insns state -- state' )
[ [ register-stack-state ] [ visit-insn ] 2bi ] reduce ;
-M: padding-analysis transfer-set ( in-set bb dfa -- out-set )
+M: padding transfer-set ( in-set bb dfa -- out-set )
drop instructions>> swap visit-insns ;
-M: padding-analysis ignore-block? ( bb dfa -- ? )
+M: padding ignore-block? ( bb dfa -- ? )
2drop f ;
-M: padding-analysis join-sets ( sets bb dfa -- set )
+M: padding join-sets ( sets bb dfa -- set )
2drop combine-states ;
: uniquely-number-instructions ( cfg -- )