summaryrefslogtreecommitdiff
path: root/chapter10b
diff options
context:
space:
mode:
Diffstat (limited to 'chapter10b')
-rw-r--r--chapter10b/README.md11
-rw-r--r--chapter10b/src/main/java/com/seaofnodes/simple/node/ReturnNode.java10
-rw-r--r--chapter10b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java2
-rw-r--r--chapter10b/src/test/java/com/seaofnodes/simple/Chapter04Test.java3
-rw-r--r--chapter10b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java2
5 files changed, 17 insertions, 11 deletions
diff --git a/chapter10b/README.md b/chapter10b/README.md
index 599705f2..c033a850 100644
--- a/chapter10b/README.md
+++ b/chapter10b/README.md
@@ -41,7 +41,8 @@ of a memory aggregate is 1; precise slots are greater than 1.
We do not allocate a Start projection, scope binding, or loop Phi for every
declared field. Start supplies one memory value, Scope holds one `$mem` binding,
-and Return consumes one complete memory value. The optimizer introduces slices
+and Return consumes `{ctrl, $mem, result}`. As with Start's outputs, control is
+in slot 0 and memory in slot 1. The optimizer introduces slices
only where graph operations require them.
## Three memory nodes
@@ -159,10 +160,10 @@ alias to become known later, using the same representation. Its private
constructor memory, escape tracking, incomplete types, and module alias
remapping are separate extensions and are not needed here.
-Chapters 11-24 currently retain their older parser-managed memory chains.
-Forwarding this representation through those snapshots is tracked in the
-[backport queue](../docs/chapter-backports.md). Chapter 11's scheduling lesson
-therefore still shows the older graph construction, with the same language.
+Chapter 11 schedules this representation, including alias-specific load/store
+anti-dependencies. Chapters 12-24 currently retain their older parser-managed
+memory chains; forwarding through those snapshots is tracked in the
+[backport queue](../docs/chapter-backports.md).
## Build and test
diff --git a/chapter10b/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter10b/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index f13f3708..96d58599 100644
--- a/chapter10b/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter10b/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -4,15 +4,16 @@ import com.seaofnodes.simple.type.*;
import java.util.BitSet;
-/** Keeps the return value and all preceding memory effects alive. */
+/** Keeps all preceding memory effects and the return value alive: {ctrl, $mem, value}. */
public class ReturnNode extends Node {
public ReturnNode(Node ctrl, Node data, ScopeNode scope) {
- super(ctrl, data, scope.lookup("$mem"));
+ super(ctrl, scope.lookup("$mem"), data);
}
public Node ctrl() { return in(0); }
- public Node expr() { return in(1); }
+ public Node mem () { return in(1); }
+ public Node expr() { return in(2); }
@Override
public String label() { return "Return"; }
@@ -28,7 +29,8 @@ public class ReturnNode extends Node {
@Override
public Type compute() {
- return TypeTuple.make(ctrl()._type,expr()._type);
+ // Return exposes the complete memory state.
+ return TypeTuple.make(ctrl()._type,TypeMem.BOT,expr()._type);
}
@Override
diff --git a/chapter10b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter10b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index 5e21c852..600e9c73 100644
--- a/chapter10b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/chapter10b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -52,7 +52,7 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
if( n instanceof ProjNode ) return n.isCFG() ? Role.CTRL : isMem(n) ? Role.MEM : Role.DATA;
if( n instanceof RegionNode && i == 0 ) return Role.ASSOC;
if( i == 0 || n instanceof RegionNode || n instanceof StopNode ) return Role.CTRL;
- if( i == 1 && n instanceof MemOpNode || i == 2 && n instanceof ReturnNode ) return Role.MEM;
+ if( i == 1 && (n instanceof MemOpNode || n instanceof ReturnNode) ) return Role.MEM;
Node def = n.in(i);
if( def != null && isMem(def) ) return Role.MEM;
return Role.DATA;
diff --git a/chapter10b/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/chapter10b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
index f1603cc4..edc62f50 100644
--- a/chapter10b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
+++ b/chapter10b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
@@ -85,6 +85,9 @@ public class Chapter04Test {
ReturnNode ret = stop.ret();
assertTrue(ret.in(0) instanceof ProjNode);
assertTrue(ret.in(1) instanceof ProjNode);
+ assertEquals(1, ((ProjNode)ret.in(1))._idx);
+ assertTrue(ret.in(2) instanceof ProjNode);
+ assertEquals(2, ((ProjNode)ret.in(2))._idx);
}
@Test
diff --git a/chapter10b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter10b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index e49e0303..ac7c5e09 100644
--- a/chapter10b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/chapter10b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -163,7 +163,7 @@ public class Evaluator {
case null:
return Status.FALLTHROUGH;
case ReturnNode ret:
- return val(ret.in(1));
+ return val(ret.expr());
case IfNode ifn:
block = block.next()[isTrue(val(ifn.in(1))) ? 0 : 1];
if (block == null) return Status.FALLTHROUGH;