summaryrefslogtreecommitdiff
path: root/chapter18/src/test
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-19 18:50:22 -0700
committerCliff Click <cliffc@acm.org>2026-09-19 18:50:22 -0700
commit2f779dd115acf1fc99c7b3b416273fdb66ad48cb (patch)
treea2b7c9ad70ef2e56d5ec3fb7fbb908c77c00ea06 /chapter18/src/test
parent628d94039c38f9d13df661da66df69943ccb2061 (diff)
downloadSimple-2f779dd115acf1fc99c7b3b416273fdb66ad48cb.tar.gz
Simple-2f779dd115acf1fc99c7b3b416273fdb66ad48cb.zip
debug printers no longer call self-optimizing accessors
Diffstat (limited to 'chapter18/src/test')
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter11Test.java15
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java35
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/node/PrintTestSupport.java41
3 files changed, 91 insertions, 0 deletions
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 0b24bd5d..fc9f117c 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -1,11 +1,26 @@
package com.seaofnodes.simple;
+
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class Chapter11Test {
+ @Test public void testPrintingPreservesGraph() throws Exception {
+ var code = new CodeGen("while(arg < 10) arg = arg + 1; return arg;").parse().opto().typeCheck().GCM().localSched();
+ var stop = code._stop;
+ var bfs = new IRPrinter.BFS(stop,99);
+ for( var n : bfs._bfs )
+ if( n instanceof com.seaofnodes.simple.node.CFGNode cfg ) cfg._idepth = 0;
+ new com.seaofnodes.simple.node.ConstantNode(com.seaofnodes.simple.type.TypeInteger.constant(123456));
+ com.seaofnodes.simple.node.PrintTestSupport.unchanged(stop, () -> {
+ String first = stop.p(99);
+ assertEquals(first,stop.p(99));
+ stop.toString();
+ });
+ }
+
// A placeholder test used to rapidly rotate through fuzzer produced issues
@Test
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
index 60f9b847..f9be0e93 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
@@ -1,4 +1,7 @@
package com.seaofnodes.simple;
+import com.seaofnodes.simple.type.*;
+import com.seaofnodes.simple.node.*;
+
import org.junit.Test;
import static org.junit.Assert.*;
@@ -6,6 +9,38 @@ import static org.junit.Assert.fail;
import org.junit.Ignore;
public class Chapter18Test {
+ @Test public void testPrintingForwardReferenceScope() throws Exception {
+ new CodeGen("return 0;").parse();
+ var declared = TypeMemPtr.make(TypeStruct.makeFRef("PrintForward"));
+ var scope = new ScopeNode();
+ scope.define("ptr",declared,false,new ConstantNode(TypeInteger.ZERO),null);
+ Parser.TYPES.put("PrintForward",TypeMemPtr.make(TypeStruct.make("PrintForward")));
+ var field = Var.class.getDeclaredField("_type");
+ field.setAccessible(true);
+ var v = scope._vars.get(0);
+ org.junit.Assert.assertSame(declared,field.get(v));
+ scope.toString();
+ org.junit.Assert.assertSame(declared,field.get(v));
+ }
+
+ @Test public void testPrintingLazyMemory() throws Exception {
+ var code = new CodeGen("return 0;").parse();
+ var base = new ConstantNode(com.seaofnodes.simple.type.TypeMem.BOT);
+ var outer = new ScopeNode();
+ var inner = new ScopeNode();
+ var loop = new LoopNode(null,code._start);
+ loop._type = com.seaofnodes.simple.type.Type.CONTROL;
+ var outerMem = new MemMergeNode(true);
+ outerMem.addDef(null); outerMem.addDef(base); outerMem.addDef(base);
+ outer.addDef(loop); outer.addDef(outerMem);
+ var innerMem = new MemMergeNode(true);
+ innerMem.addDef(null); innerMem.addDef(outer); innerMem.addDef(outer);
+ inner.addDef(loop); inner.addDef(innerMem);
+ var mem = new MemMergeNode(true);
+ mem.addDef(null); mem.addDef(base); mem.addDef(inner);
+ PrintTestSupport.unchanged(mem, () -> org.junit.Assert.assertTrue(mem.toString().contains("Lazy_")));
+ }
+
@Test
public void testJig() {
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/node/PrintTestSupport.java b/chapter18/src/test/java/com/seaofnodes/simple/node/PrintTestSupport.java
new file mode 100644
index 00000000..01d471bf
--- /dev/null
+++ b/chapter18/src/test/java/com/seaofnodes/simple/node/PrintTestSupport.java
@@ -0,0 +1,41 @@
+package com.seaofnodes.simple.node;
+import java.util.*;
+import static org.junit.Assert.*;
+
+// Inspect raw fields: the regression must not itself use lazy accessors.
+public class PrintTestSupport {
+ public static void unchanged(Node root, Runnable print) throws Exception {
+ var hash = Node.class.getDeclaredField("_hash");
+ hash.setAccessible(true);
+ var nodes = new ArrayList<Node>();
+ var seen = new IdentityHashMap<Node,Boolean>();
+ nodes.add(root);
+ seen.put(root,true);
+ for( int i=0; i<nodes.size(); i++ ) {
+ Node n = nodes.get(i);
+ for( Node def : n._inputs )
+ if( def!=null && seen.put(def,true)==null ) nodes.add(def);
+ for( Node use : n._outputs )
+ if( use!=null && seen.put(use,true)==null ) nodes.add(use);
+ }
+ var ins = new IdentityHashMap<Node,Node[]>();
+ var outs = new IdentityHashMap<Node,Node[]>();
+ var hashes = new IdentityHashMap<Node,Integer>();
+ var depths = new IdentityHashMap<Node,Integer>();
+ for( Node n : nodes ) {
+ ins.put(n,n._inputs.toArray(new Node[0]));
+ outs.put(n,n._outputs.toArray(new Node[0]));
+ hashes.put(n,hash.getInt(n));
+ if( n instanceof CFGNode cfg ) depths.put(n,cfg._idepth);
+ }
+ print.run();
+ for( Node n : nodes ) {
+ assertEquals("hash of node "+n._nid,(int)hashes.get(n),hash.getInt(n));
+ if( n instanceof CFGNode cfg ) assertEquals("depth of node "+n._nid,(int)depths.get(n),cfg._idepth);
+ assertEquals(ins.get(n).length,n.nIns());
+ assertEquals(outs.get(n).length,n.nOuts());
+ for( int i=0; i<n.nIns(); i++ ) assertSame(ins.get(n)[i],n.in(i));
+ for( int i=0; i<n.nOuts(); i++ ) assertSame(outs.get(n)[i],n._outputs.get(i));
+ }
+ }
+}