summaryrefslogtreecommitdiff
path: root/chapter07/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2024-01-15 16:23:49 +0000
committerGitHub <noreply@github.com>2024-01-15 08:23:49 -0800
commitd016a42b63b6c590dfd3c15a5f9cf8be10a9de56 (patch)
treed916dcca269b0c5460e2e85b2e480edb0f56f77d /chapter07/src/main/java/com/seaofnodes
parent399bb146cc0bb0c548cd0b50e51fb9aa29a7900c (diff)
downloadSimple-d016a42b63b6c590dfd3c15a5f9cf8be10a9de56.tar.gz
Simple-d016a42b63b6c590dfd3c15a5f9cf8be10a9de56.zip
Sync changes to previous chapters (#57)
Also fix broken links in README
Diffstat (limited to 'chapter07/src/main/java/com/seaofnodes')
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/Parser.java19
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/LoopNode.java13
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/Node.java4
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java11
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/ScopeNode.java9
5 files changed, 27 insertions, 29 deletions
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/Parser.java b/chapter07/src/main/java/com/seaofnodes/simple/Parser.java
index 3bc532c2..7cc52e78 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/Parser.java
@@ -13,6 +13,7 @@ import java.util.*;
* This is a simple recursive descent parser. All lexical analysis is done here as well.
*/
public class Parser {
+
/**
* A Global Static, unique to each compilation. This is a public, so we
* can make constants everywhere without having to thread the StartNode
@@ -154,24 +155,24 @@ public class Parser {
// point, and second is back edge that is set after loop is parsed
// (see end_loop() call below). Note that the absence of back edge is
// used as an indicator to switch off peepholes of the region and
- // associated phis.
+ // associated phis; see {@code inProgress()}.
- ctrl(new LoopNode(ctrl(),null).peephole()); // Note we set back edge to null here
+ ctrl(new LoopNode(ctrl()).peephole()); // Note we set back edge to null here
// At loop head, we clone the current Scope (this includes all
// names in every nesting level within the Scope).
// We create phis eagerly for all the names we find, see dup().
// Save the current scope as the loop head
- ScopeNode head = _xScopes.push(_scope).keep();
+ ScopeNode head = _scope.keep();
// Clone the head Scope to create a new Scope for the body.
// Create phis eagerly as part of cloning
- _scope = _scope.dup(true); // The true argument triggers creating phis
+ _xScopes.push(_scope = _scope.dup(true)); // The true argument triggers creating phis
// Parse predicate
var pred = require(parseExpression(), ")");
// IfNode takes current control and predicate
- IfNode ifNode = (IfNode)new IfNode(ctrl(), pred).<IfNode>keep().peephole();
+ IfNode ifNode = (IfNode)new IfNode(ctrl(), pred).keep().peephole();
// Setup projection nodes
Node ifT = new ProjNode(ifNode, 0, "True" ).peephole();
ifNode.unkeep();
@@ -337,10 +338,10 @@ public class Parser {
var lhs = parseAddition();
if (match("==")) return new BoolNode.EQ(lhs, parseComparison()).peephole();
if (match("!=")) return new NotNode(new BoolNode.EQ(lhs, parseComparison()).peephole()).peephole();
- if (match("<" )) return new BoolNode.LT(lhs, parseComparison()).peephole();
if (match("<=")) return new BoolNode.LE(lhs, parseComparison()).peephole();
- if (match(">" )) return new BoolNode.LT(parseComparison(), lhs).peephole();
+ if (match("<" )) return new BoolNode.LT(lhs, parseComparison()).peephole();
if (match(">=")) return new BoolNode.LE(parseComparison(), lhs).peephole();
+ if (match(">" )) return new BoolNode.LT(parseComparison(), lhs).peephole();
return lhs;
}
@@ -437,7 +438,7 @@ public class Parser {
// Require an exact match
private void require(String syntax) { require(null, syntax); }
- private Node require(Node n, String syntax) {
+ private <N extends Node> N require(N n, String syntax) {
if (match(syntax)) return n;
throw errorSyntax(syntax);
}
@@ -446,7 +447,7 @@ public class Parser {
return error("Syntax error, expected " + syntax + ": " + _lexer.getAnyNextToken());
}
- static RuntimeException error(String errorMessage) {
+ public static RuntimeException error( String errorMessage ) {
return new RuntimeException(errorMessage);
}
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/LoopNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/LoopNode.java
index eaf19199..aeb8a7f9 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/LoopNode.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/LoopNode.java
@@ -6,7 +6,7 @@ import java.util.BitSet;
public class LoopNode extends RegionNode {
- public LoopNode( Node entry, Node back) { super(null,entry,back); }
+ public LoopNode( Node entry ) { super(null,entry,null); }
Node entry() { return in(1); }
Node back () { return in(2); }
@@ -15,21 +15,14 @@ public class LoopNode extends RegionNode {
public String label() { return "Loop"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
- return sb.append("Loop").append(_nid);
- }
-
- @Override
public Type compute() {
return inProgress() ? Type.CONTROL : super.compute();
}
-
+
@Override
public Node idealize() {
return inProgress() ? null : super.idealize();
}
- @Override Node idom() { return entry(); }
-
- @Override public boolean inProgress() { return back()==null; }
+ @Override Node idom() { return entry(); }
}
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter07/src/main/java/com/seaofnodes/simple/node/Node.java
index 4cd1b3d2..d9d9366f 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -229,11 +229,11 @@ public abstract class Node {
// Error is 'use' does not exist; ok for 'use' to be null.
protected boolean delUse( Node use ) {
Utils.del(_outputs, Utils.find(_outputs, use));
- return _outputs.size() == 0;
+ return _outputs.isEmpty();
}
// Shortcut for "popping" n nodes. A "pop" is basically a
- // set_def(last,null) followed by lowering the nIns() count.
+ // setDef(last,null) followed by lowering the nIns() count.
void popN(int n) {
for( int i=0; i<n; i++ ) {
Node old_def = _inputs.removeLast();
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
index 7113f5c4..00c010b2 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -3,11 +3,13 @@ package com.seaofnodes.simple.node;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.type.Type;
+import java.util.Collection;
import java.util.BitSet;
public class RegionNode extends Node {
- public RegionNode(Node... inputs) { super(inputs); }
+ public RegionNode(Node... nodes) { super(nodes); }
+
@Override
public String label() { return "Region"; }
@@ -21,6 +23,7 @@ public class RegionNode extends Node {
@Override
public Type compute() {
+ if( inProgress() ) return Type.CONTROL;
Type t = Type.XCONTROL;
for (int i = 1; i < nIns(); i++)
t = t.meet(in(i)._type);
@@ -29,6 +32,7 @@ public class RegionNode extends Node {
@Override
public Node idealize() {
+ if( inProgress() ) return null;
int path = findDeadInput();
if( path != 0 ) {
for( Node phi : _outputs )
@@ -76,5 +80,8 @@ public class RegionNode extends Node {
return (_idom=lhs);
}
- public boolean inProgress() { return false; }
+ // True if last input is null
+ public final boolean inProgress() {
+ return in(nIns()-1) == null;
+ }
}
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
index a83ae1a7..80a09ff4 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
@@ -170,12 +170,9 @@ public class ScopeNode extends Node {
RegionNode r = (RegionNode) ctrl(new RegionNode(null,ctrl(), that.ctrl()).keep());
String[] ns = reverseNames();
// Note that we skip i==0, which is bound to '$ctrl'
- for (int i = 1; i < nIns(); i++) {
- if( in(i) != that.in(i) ) { // No need for redundant Phis
- Node phi = new PhiNode(ns[i], r, in(i), that.in(i)).peephole();
- setDef(i, phi);
- }
- }
+ for (int i = 1; i < nIns(); i++)
+ if( in(i) != that.in(i) ) // No need for redundant Phis
+ setDef(i, new PhiNode(ns[i], r, in(i), that.in(i)).peephole());
that.kill(); // Kill merged scope
return r.unkeep().peephole();
}