summaryrefslogtreecommitdiff
path: root/chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java
blob: afa0ec58faa6689384d01504c3d75707e69ab76d (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
package com.seaofnodes.simple;

import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.TypeInteger;
import org.junit.Test;
import static org.junit.Assert.*;

public class SccpTest {
    @Test public void testLoopFixedPoint() {
        var code = new CodeGen("int x=1; while(arg) { x=2-x; arg--; } return x;").parse().iter();
        assertFalse(code.link(code._main).ret().expr()._type.isConstant());
        code.opto();
        assertSame(TypeInteger.TRUE,code.link(code._main).ret().expr()._type);
        code.driver(CodeGen.Phase.LocalSched);
        assertEquals("1",Eval2.eval(code,4));
    }

    @Test public void testConservativeCalls() {
        var code = new CodeGen("val f={ int x -> x+1; }; return f(1)+f(2);").parse().iter().opto();
        int[] parms = {0};
        code._start.walk(n -> {
            if( n instanceof ParmNode p && "x".equals(p._label) ) {
                parms[0]++;
                assertSame(TypeInteger.BOT,p._type);
                assertTrue(p.fun().in(1) instanceof StartNode);
            }
            if( n instanceof CallEndNode cend ) assertEquals(1,cend.nIns());
            return null;
        });
        assertEquals(1,parms[0]);
        code.driver(CodeGen.Phase.LocalSched);
        assertEquals("5",Eval2.eval(code,0));
    }
}