2011-09-08 12:57:40 -04:00
|
|
|
! Copyright (C) 2011 Alex Vondrak.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2011-06-09 15:08:25 -04:00
|
|
|
USING: accessors assocs compiler.cfg compiler.cfg.graphviz
|
2011-06-08 22:01:56 -04:00
|
|
|
compiler.cfg.gvn compiler.cfg.gvn.expressions
|
2011-06-09 15:08:25 -04:00
|
|
|
compiler.cfg.gvn.graph compiler.cfg.optimizer continuations
|
|
|
|
formatting graphviz graphviz.notation graphviz.render
|
|
|
|
io.directories kernel math.parser namespaces prettyprint
|
|
|
|
sequences sorting splitting tools.annotations ;
|
2011-06-04 16:26:38 -04:00
|
|
|
IN: compiler.cfg.gvn.testing
|
|
|
|
|
2011-06-08 22:01:56 -04:00
|
|
|
GENERIC: expr>str ( expr -- str )
|
|
|
|
|
|
|
|
M: integer-expr expr>str value>> number>string ;
|
|
|
|
|
2011-06-09 20:08:41 -04:00
|
|
|
M: reference-expr expr>str value>> unparse ;
|
2011-06-08 22:01:56 -04:00
|
|
|
|
2011-06-23 20:33:49 -04:00
|
|
|
M: sequence expr>str [ unparse ] map " " join ;
|
|
|
|
|
|
|
|
M: object expr>str unparse ;
|
2011-06-08 22:01:56 -04:00
|
|
|
|
2011-06-09 23:33:06 -04:00
|
|
|
: value-mapping ( from to -- str )
|
2011-06-08 22:01:56 -04:00
|
|
|
over exprs>vns get value-at* [
|
|
|
|
expr>str "%d -> <%d> (%s)\\l" sprintf
|
|
|
|
] [
|
|
|
|
drop "%d -> <%d>\\l" sprintf
|
|
|
|
] if ;
|
|
|
|
|
2011-06-09 23:33:06 -04:00
|
|
|
: gvns ( -- str )
|
2011-06-08 22:01:56 -04:00
|
|
|
vregs>vns get >alist natural-sort [
|
2011-06-09 23:33:06 -04:00
|
|
|
first2 value-mapping
|
2011-06-08 22:01:56 -04:00
|
|
|
] map "" concat-as ;
|
|
|
|
|
|
|
|
: invert-assoc ( assoc -- inverted )
|
|
|
|
V{ } clone [
|
|
|
|
[ push-at ] curry assoc-each
|
|
|
|
] keep ;
|
|
|
|
|
2011-06-09 23:33:06 -04:00
|
|
|
: congruence-classes ( -- str )
|
|
|
|
vregs>vns get invert-assoc >alist natural-sort [
|
2011-06-08 22:01:56 -04:00
|
|
|
first2
|
|
|
|
natural-sort [ number>string ] map ", " join
|
|
|
|
"<%d> : {%s}\\l" sprintf
|
|
|
|
] map "" concat-as ;
|
|
|
|
|
|
|
|
: basic-block# ( -- n )
|
|
|
|
basic-block get number>> ;
|
|
|
|
|
2011-06-09 23:33:06 -04:00
|
|
|
: add-gvns ( graph -- graph' )
|
|
|
|
"gvns" add-node[
|
|
|
|
gvns congruence-classes "\\l\\l" glue =label
|
|
|
|
"plaintext" =shape
|
|
|
|
];
|
|
|
|
"gvns" 0 add-edge[ "invis" =style ];
|
|
|
|
basic-block# add-node[ "bold" =style ];
|
|
|
|
;
|
2011-06-08 22:01:56 -04:00
|
|
|
|
2011-06-09 15:08:25 -04:00
|
|
|
SYMBOL: iteration
|
|
|
|
|
|
|
|
: iteration-dir ( -- path )
|
|
|
|
iteration get number>string "gvn-iter" prepend ;
|
2011-06-08 22:01:56 -04:00
|
|
|
|
2011-06-09 15:08:25 -04:00
|
|
|
: new-iteration ( -- )
|
|
|
|
iteration inc iteration-dir make-directories ;
|
|
|
|
|
|
|
|
: draw-annotated-cfg ( -- )
|
|
|
|
iteration-dir [
|
2011-06-09 23:33:06 -04:00
|
|
|
cfg get cfgviz add-gvns
|
2011-07-30 21:58:50 -04:00
|
|
|
basic-block# number>string "bb" prepend svg
|
2011-06-09 15:08:25 -04:00
|
|
|
] with-directory ;
|
|
|
|
|
|
|
|
: annotate-gvn ( -- )
|
|
|
|
\ value-numbering-iteration
|
|
|
|
[ [ new-iteration ] prepend ] annotate
|
2011-06-04 16:26:38 -04:00
|
|
|
\ value-numbering-step
|
2011-06-09 15:08:25 -04:00
|
|
|
[ [ draw-annotated-cfg ] append ] annotate ;
|
2011-06-04 16:26:38 -04:00
|
|
|
|
|
|
|
: reset-gvn ( -- )
|
2011-06-09 15:08:25 -04:00
|
|
|
\ value-numbering-iteration reset
|
2011-06-04 16:26:38 -04:00
|
|
|
\ value-numbering-step reset ;
|
|
|
|
|
2011-06-09 15:08:25 -04:00
|
|
|
! Replace compiler.cfg.value-numbering:value-numbering with
|
|
|
|
! compiler.cfg.gvn:value-numbering
|
|
|
|
|
|
|
|
: gvn-passes ( -- passes )
|
|
|
|
\ optimize-cfg def>> [
|
|
|
|
name>> "value-numbering" =
|
|
|
|
] split-when [ value-numbering ] join ;
|
|
|
|
|
2011-06-27 18:16:42 -04:00
|
|
|
: test-gvn ( path quot -- )
|
|
|
|
gvn-passes passes [
|
|
|
|
0 iteration [ watch-optimizer* ] with-variable
|
|
|
|
] with-variable ;
|
|
|
|
|
2011-06-09 15:08:25 -04:00
|
|
|
: watch-gvn ( path quot -- )
|
2011-06-27 18:16:42 -04:00
|
|
|
annotate-gvn [ test-gvn ] [ reset-gvn ] [ ] cleanup ;
|