: join-blocks ( cfg -- )
needs-predecessors
-
- dup post-order [
- dup join-block?
- [ dup predecessor join-block ] [ drop ] if
- ] each
-
- cfg-changed predecessors-changed drop ;
+ [
+ post-order [
+ dup join-block?
+ [ dup predecessor join-block ] [ drop ] if
+ ] each
+ ] [ cfg-changed ] [ predecessors-changed ] tri ;
successors>> [ add-to-worklist ] each
] slurp-deque
- cfg-changed drop ;
+ cfg-changed ;
swap >>word
swap >>entry ;
-: cfg-changed ( cfg -- cfg )
+: cfg-changed ( cfg -- )
f >>post-order
f >>linear-order
f >>dominance-valid?
- f >>loops-valid? ; inline
+ f >>loops-valid? drop ; inline
-: predecessors-changed ( cfg -- cfg )
- f >>predecessors-valid? ;
+: predecessors-changed ( cfg -- )
+ f >>predecessors-valid? drop ;
: with-cfg ( ..a cfg quot: ( ..a cfg -- ..b ) -- ..b )
[ dup cfg ] dip with-variable ; inline
needs-predecessors
dup collect-copies
dup rename-copies
- predecessors-changed drop ;
+ predecessors-changed ;
dup blocks-with-gc [
[ needs-predecessors ] dip
[ process-block ] each
- cfg-changed
+ dup cfg-changed
] unless-empty ;
: perform-mappings ( bb to mappings -- )
dup empty? [ 3drop ] [
mapping-instructions insert-basic-block
- cfg get cfg-changed drop
+ cfg get cfg-changed
] if ;
: resolve-edge-data-flow ( bb to -- )
dup [ convert-phis ] each-basic-block
- cfg-changed drop ;
+ cfg-changed ;
dup [ visit-block ] each-basic-block
- cfg-changed ;
+ dup cfg-changed ;
] [ drop ] if ;
: optimize-tail-calls ( cfg -- )
- dup [ optimize-tail-call ] each-basic-block
-
- cfg-changed predecessors-changed drop ;
+ [ [ optimize-tail-call ] each-basic-block ]
+ [ cfg-changed ]
+ [ predecessors-changed ] tri ;
instructions>> [ pop* ] [ [ ##branch new-insn ] dip push ] bi ;
: delete-useless-conditionals ( cfg -- )
- dup [
- dup delete-conditional? [ delete-conditional ] [ drop ] if
- ] each-basic-block
-
- cfg-changed predecessors-changed drop ;
+ [
+ [
+ dup delete-conditional? [ delete-conditional ] [ drop ] if
+ ] each-basic-block
+ ]
+ [ cfg-changed ] [ predecessors-changed ] tri ;
[ process-instruction ] map flatten ;
: value-numbering ( cfg -- )
- dup [ value-numbering-step ] simple-optimization
- cfg-changed predecessors-changed drop ;
+ [ [ value-numbering-step ] simple-optimization ]
+ [ cfg-changed ]
+ [ predecessors-changed ] tri ;
needs-predecessors
dup determine-value-numbers
dup eliminate-common-subexpressions
-
- cfg-changed predecessors-changed ;
+ [ cfg-changed ] [ predecessors-changed ] bi ;