UNPKG

3.92 kBJavaScriptView Raw
1'use strict';
2
3var assertText = require('assert-text');
4var pipeline = require('json-pipeline');
5
6var scheduler = require('../');
7var fixtures = require('./fixtures');
8
9assertText.options.trim = true;
10
11describe('JSON Pipeline Scheduler', function() {
12 fixtures.test('example from Click\'s thesis', function(p) {
13 var start = p.add('start');
14 var body = p.add('region');
15 var exit = p.add('region');
16
17 start = p.add('jump').setControl(start);
18
19 var i0 = p.add('literal').addLiteral(0);
20 var a = p.add('read()');
21
22 var phi = p.add('ssa:phi').addInput(i0).setControl(body);
23 var one = p.add('literal').addLiteral(1);
24 var addOne = p.add('add', [ a, one ]);
25 var i2 = p.add('add', [ phi, addOne ]);
26 phi.addInput(i2);
27
28 var ten = p.add('literal').addLiteral(10);
29 var cc = p.add('le', [ i2, ten ]);
30 var branch = p.add('if', cc).setControl(phi);
31
32 body.setControl(start, branch);
33
34 var two = p.add('literal').addLiteral(2);
35 var mul = p.add('mul', [ i2, two ]);
36
37 exit.setControl(branch);
38 var ret = p.add('return', mul).setControl(exit);
39 }, function() {/*
40 pipeline {
41 b0 {
42 i0 = literal 0
43 i1 = read()
44 i2 = literal 1
45 i3 = add i1, i2
46 i4 = literal 10
47 i5 = jump ^b0
48 }
49 b0 -> b1
50 b0 => b1
51 b1 {
52 i6 = ssa:phi ^b1, i0, i7
53 i7 = add i6, i3
54 i8 = le i7, i4
55 i9 = if ^i6, i8
56 }
57 b1 -> b1, b2
58 b1 => b2
59 b1 ~> b1
60 b2 {
61 i10 = literal 2
62 i11 = mul i7, i10
63 i12 = return ^b2, i11
64 }
65 }
66 */});
67
68 fixtures.test('merge/branch', function(p) {
69 var start = p.add('start');
70 var t = p.add('literal').addLiteral(true);
71 var branch = p.add('if', t).setControl(start);
72
73 var left = p.add('region').setControl(branch);
74
75 var leftValue = p.add('literal').addLiteral('left');
76 var leftJump = p.add('jump').setControl(left);
77
78 var right = p.add('region').setControl(branch);
79
80 var rightValue = p.add('literal').addLiteral('right');
81 var rightJump = p.add('jump').setControl(right);
82
83 var merge = p.add('region').setControl(leftJump, rightJump);
84 var phi = p.add('ssa:phi', [ leftValue, rightValue ]).setControl(merge);
85 var ret = p.add('return', phi).setControl(phi);
86 }, function() {/*
87 pipeline {
88 b0 {
89 i0 = literal true
90 i1 = if ^b0, i0
91 }
92 b0 -> b1, b2
93 b0 => b3, b1, b2
94 b1 {
95 i2 = literal "left"
96 i3 = jump ^b1
97 }
98 b1 -> b3
99 b1 ~> b3
100 b2 {
101 i4 = literal "right"
102 i5 = jump ^b2
103 }
104 b2 -> b3
105 b2 ~> b3
106 b3 {
107 i6 = ssa:phi ^b3, i2, i4
108 i7 = return ^i6, i6
109 }
110 }
111 */});
112
113 fixtures.test('single block node order', function(p) {
114 var start = p.add('start');
115 var ret = p.add('return').setControl(start);
116 var one = p.add('literal').addLiteral(1);
117 var add = p.add('add').addInput(one);
118 var two = p.add('literal').addLiteral(2);
119 add.addInput(two);
120 ret.addInput(add);
121 }, function() {/*
122 pipeline {
123 b0 {
124 i0 = literal 1
125 i1 = literal 2
126 i2 = add i0, i1
127 i3 = return ^b0, i2
128 }
129 }
130 */});
131
132 fixtures.test('loop control edges', function(p) {
133 var start = p.add('start');
134 var startEnd = p.add('jump').setControl(start);
135
136 var merge = p.add('region');
137 var mergeEnd = p.add('jump').setControl(merge);
138
139 var end = p.add('region').setControl(mergeEnd);
140 var endEnd = p.add('jump').setControl(end);
141
142 merge.setControl(startEnd, endEnd);
143 }, function() {/*
144 pipeline {
145 b0 {
146 i0 = jump ^b0
147 }
148 b0 -> b1
149 b0 => b1
150 b1 {
151 i1 = jump ^b1
152 }
153 b1 -> b2
154 b1 => b2
155 b1 ~> b1
156 b2 {
157 i2 = jump ^b2
158 }
159 b2 -> b1
160 b2 ~> b1
161 }
162 */});
163});