summaryrefslogtreecommitdiff
path: root/chapter-interprocedural-sccp/src/test/java/com/seaofnodes/simple/PhaseTest.java
blob: 899f42fe47743dc94c2a8a0dbbdab1b7536b2063 (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
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 testStopAndResume() {
        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.Iter);
        assertEquals(Phase.Iter,code._phase);
        assertEquals("Parse Iter",String.join(" ",phases));
        code.driver(Phase.TypeCheck);
        code.driver(Phase.TypeCheck); // Repeated requests do not rerun phases.
        code.driver(Phase.LoopTree);
        assertEquals(Phase.LoopTree,code._phase);
        code.driver(Phase.LocalSched);
        assertEquals("Parse Iter Opto IterPostOpto FinalizeIR TypeCheck LoopTree Schedule LocalSched",String.join(" ",phases));
        assertEquals("45",Eval2.eval(code,10));
    }

    @Test public void testResumeMachineCompilation() {
        CodeGen staged = new CodeGen(SRC).driver(Phase.TypeCheck);
        staged.driver(Phase.Select,"x86_64_v2","SystemV");
        staged.driver(Phase.Encoding,"x86_64_v2","SystemV");
        byte[] bits = staged._encoding._bits.toByteArray();
        CodeGen direct = new CodeGen(SRC).driver(Phase.Encoding,"x86_64_v2","SystemV");
        assertArrayEquals(bits,direct._encoding._bits.toByteArray());
    }

    @Test public void testOptoRequiresIter() {
        CodeGen code = new CodeGen(SRC).parse();
        try {
            code.opto();
            fail("Opto must not implicitly run Iter");
        } catch( AssertionError expected ) {
            assertEquals("Cannot run Opto after Parse",expected.getMessage());
        }
        code.iter().opto();
        assertEquals(Phase.Opto,code._phase);
        code.driver(Phase.LocalSched);
        assertEquals("45",Eval2.eval(code,10));
    }
}