1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package com.seaofnodes.simple;
import com.seaofnodes.graph.GraphObserver;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.codegen.CodeGen.Phase;
import com.seaofnodes.simple.node.Node;
import java.util.ArrayList;
import org.junit.Test;
import static org.junit.Assert.*;
public class PhaseTest {
private static final String SRC = "int sum=0; for(int i=0; i<arg; i++) sum+=i; return sum;";
@Test public void testIdealPhasesAndResume() {
ArrayList<String> phases = new ArrayList<>();
CodeGen code = new CodeGen(SRC);
code._obs = new GraphObserver<Node>() {
@Override public void before(Node n) {}
@Override public void after(Node n, Node repl, boolean applied) {}
@Override public void phase(String phase) { phases.add(phase); }
};
code.driver(Phase.TypeCheck);
code.driver(Phase.TypeCheck); // A repeated request does not rerun anything.
code.driver(Phase.LocalSched);
assertEquals("Parse Iter Opto IterPostOpto FinalizeIR TypeCheck Lower LoopTree Unlink Schedule LocalSched",
String.join(" ",phases));
assertNull(code._serial);
assertNull(code._mach);
assertEquals("45",Eval2.eval(code,10));
}
@Test public void testEncodingWithoutSerialization() {
for( String cpu : new String[]{"x86_64_v2","arm","riscv"} ) {
CodeGen code = new CodeGen(SRC).driver(Phase.TypeCheck);
code.driver(Phase.Unlink,cpu,"SystemV");
code.driver(Phase.Select,cpu,"SystemV");
code.driver(Phase.Encoding,cpu,"SystemV");
assertNull(code._serial);
byte[] staged = code._encoding._bits.toByteArray();
CodeGen direct = new CodeGen(SRC).driver(Phase.Encoding,cpu,"SystemV");
assertArrayEquals(staged,direct._encoding._bits.toByteArray());
}
}
@Test public void testExplicitSerializationAndMemoryExport() {
CodeGen code = new CodeGen(SRC).driver(Phase.Serialize);
assertNotNull(code._serial);
assertEquals(Phase.Serialize,code._phase);
code.driver(Phase.Encoding,"riscv","SystemV");
assertNotNull(code._serial);
CodeGen memory = new CodeGen(SRC).driver("riscv","SystemV",true,false);
assertNull(memory._serial);
assertEquals(Phase.Export,memory._phase);
CodeGen late = new CodeGen(SRC).driver(Phase.Encoding,"riscv","SystemV");
try {
late.exportELF(false,false);
fail("Cannot recover ideal IR after lowering and instruction selection");
} catch( IllegalStateException expected ) {
assertTrue(expected.getMessage().contains("Serialize before Lower"));
}
}
}
|