From 7edca9823ec8ef0aed10c88fa07ef969792aab77 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 19 Oct 2026 14:56:14 -0700 Subject: Split from ch25, SCCP and interprocedural SCCP --- .../test/java/com/seaofnodes/simple/SccpTest.java | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java (limited to 'chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java') diff --git a/chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java b/chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java new file mode 100644 index 00000000..afa0ec58 --- /dev/null +++ b/chapter-sccp/src/test/java/com/seaofnodes/simple/SccpTest.java @@ -0,0 +1,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)); + } +} -- cgit v1.2.3