summaryrefslogtreecommitdiff
path: root/chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-19 14:56:14 -0700
committerCliff Click <cliffc@acm.org>2026-10-19 14:56:14 -0700
commit7edca9823ec8ef0aed10c88fa07ef969792aab77 (patch)
treed95e308cac7a9c5039a59be636d881982a9b4878 /chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java
parent3617495d8efbcce23bbc9f1754c7d27d34d30a52 (diff)
downloadSimple-main.tar.gz
Simple-main.zip
Split from ch25, SCCP and interprocedural SCCPmain
Diffstat (limited to 'chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java')
-rw-r--r--chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java b/chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java
new file mode 100644
index 00000000..6156700d
--- /dev/null
+++ b/chapter-sccp/src/test/java/com/seaofnodes/simple/SchedulerTest.java
@@ -0,0 +1,94 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.codegen.CodeGen;
+import com.seaofnodes.simple.evaluator.Evaluator;
+import com.seaofnodes.simple.node.StopNode;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class SchedulerTest {
+
+ @Test public void testMemoryPhiAcrossSiblingBranch() {
+ // The inner memory Phi defines the load's memory. The outer Phi's
+ // other input comes from a branch not dominated by that definition.
+ String src = """
+ struct S { int x; }; !S !a=new S; !S !b=new S;
+ a.x=10; b.x=20; !S !p=a; if(arg>3) p=b;
+ int result=0;
+ if(arg>0) {
+ if(arg>2) p.x=30; else p.x=40;
+ result=a.x;
+ }
+ return result;
+ """;
+ var code = new CodeGen(src).driver(CodeGen.Phase.LocalSched);
+ long[] expected = {0,40,40,30,10,10};
+ for( int arg=0; arg<expected.length; arg++ )
+ assertEquals(Long.toString(expected[arg]),Eval2.eval(code,arg));
+ }
+
+
+ private static void assertObj(Object obj, String name, Object... fields) {
+ assertEquals(Evaluator.Obj.class, obj.getClass());
+ var o = (Evaluator.Obj)obj;
+ assertEquals(name, o.struct()._name);
+ Assert.assertArrayEquals(fields, o.fields());
+ }
+
+ @Test
+ @Ignore
+ public void testJig() {
+ CodeGen code = new CodeGen("""
+struct S {
+ int f;
+}
+!S !v=new S;
+v.f = 2;
+int i=v.f;
+if (arg) v.f=1;
+return i;
+""");
+ code.parse();//.iter().opto().iterPostOpto().finalizeIR();
+ var eval = new Evaluator(code._stop);
+ assertEquals(2L, eval.evaluate(1, 10));
+ }
+
+ @Test
+ public void testStoreInIf() {
+ CodeGen code = new CodeGen("""
+struct S {
+ int f;
+};
+!S !v0=new S;
+if(arg) v0.f=1;
+return v0;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ var eval = new Evaluator(code._stop);
+ assertObj(eval.evaluate(0, 10), "S", 0L);
+ assertObj(eval.evaluate(1, 10), "S", 1L);
+ }
+
+ @Test
+ public void testStoreInIf2() {
+ CodeGen code = new CodeGen("""
+struct S {
+ int f;
+};
+!S !v=new S;
+v.f = 2;
+int i=new S.f;
+i=v.f;
+if (arg) v.f=1;
+return i;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ var eval = new Evaluator(code._stop);
+ assertEquals(2L, eval.evaluate(0, 10));
+ assertEquals(2L, eval.evaluate(1, 10));
+ }
+
+}