1 IN: optimizer.control.tests
2 USING: tools.test optimizer.control combinators kernel
3 sequences inference.dataflow math inference classes strings
6 : label-is-loop? ( node word -- ? )
9 { [ over #label? not ] [ 2drop f ] }
10 { [ over #label-word over eq? not ] [ 2drop f ] }
11 { [ over #label-loop? not ] [ 2drop f ] }
14 ] curry node-exists? ;
16 : label-is-not-loop? ( node word -- ? )
19 { [ over #label? not ] [ f ] }
20 { [ over #label-word over eq? not ] [ f ] }
21 { [ over #label-loop? ] [ f ] }
24 ] curry node-exists? ;
26 : loop-test-1 ( a -- )
27 dup [ 1+ loop-test-1 ] [ drop ] if ; inline
30 [ loop-test-1 ] dataflow detect-loops
31 \ loop-test-1 label-is-loop?
35 [ loop-test-1 1 2 3 ] dataflow detect-loops
36 \ loop-test-1 label-is-loop?
40 [ [ loop-test-1 ] each ] dataflow detect-loops
41 \ loop-test-1 label-is-loop?
45 [ [ loop-test-1 ] each ] dataflow detect-loops
46 \ (each-integer) label-is-loop?
49 : loop-test-2 ( a -- )
50 dup [ 1+ loop-test-2 1- ] [ drop ] if ; inline
53 [ loop-test-2 ] dataflow detect-loops
54 \ loop-test-2 label-is-not-loop?
57 : loop-test-3 ( a -- )
58 dup [ [ loop-test-3 ] each ] [ drop ] if ; inline
61 [ loop-test-3 ] dataflow detect-loops
62 \ loop-test-3 label-is-not-loop?
65 : loop-test-4 ( a -- )
72 : find-label ( node -- label )
73 dup #label? [ node-successor find-label ] unless ;
76 dataflow detect-loops find-label
78 [ node-child find-tail find-loop-exits [ class ] map ] keep
82 [ loop-test-4 ] test-loop-exits
85 : loop-test-5 ( a -- )
96 [ { #values #values } t ] [
97 [ loop-test-5 ] test-loop-exits
100 : loop-test-6 ( a -- )
112 [ loop-test-6 ] test-loop-exits
116 [ [ [ ] map ] map ] dataflow detect-loops
117 [ dup #label? swap #loop? not and ] node-exists?
125 blah [ b ] [ a ] if ; inline
128 blah [ b ] [ a ] if ; inline
131 [ a ] dataflow detect-loops
136 [ a ] dataflow detect-loops
141 [ b ] dataflow detect-loops
146 [ a ] dataflow detect-loops
153 blah [ b' b' ] [ a' ] if ; inline
156 blah [ b' ] [ a' ] if ; inline
159 [ a' ] dataflow detect-loops
164 [ b' ] dataflow detect-loops
168 ! I used to think this should be f, but doing this on pen and
169 ! paper almost convinced me that a loop conversion here is
170 ! sound. The loop analysis algorithm looks pretty solid -- its
171 ! a standard iterative dataflow problem after all -- so I'm
172 ! tempted to believe the computer here
174 [ b' ] dataflow detect-loops
179 [ a' ] dataflow detect-loops