summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/PhaseTest.java
blob: 7252378ad9334ff687b28c60d7f6b1f93f6bc69c (plain)
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"));
        }
    }
}