summaryrefslogtreecommitdiff
path: root/chapter08/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2024-01-15 17:26:29 +0000
committerGitHub <noreply@github.com>2024-01-15 09:26:29 -0800
commitab8b1f298dcef84026f6b8e04576111126e8c68a (patch)
tree37b55161f316b8f6cf5f91af985a18f086a8cc8c /chapter08/src/main/java/com/seaofnodes
parent8a61361eae582669d163e1cdd032a314a012a365 (diff)
downloadSimple-ab8b1f298dcef84026f6b8e04576111126e8c68a.tar.gz
Simple-ab8b1f298dcef84026f6b8e04576111126e8c68a.zip
Merge Cliff's fixes (#59)
* #52 Update chapter8 to align with chapter7 * #52 Update chapter8 to align with chapter7 * #52 Fix spacing * #51 get started on break and continue * #51 get started on break and continue * #51 more on break and continue * #51 more on break and continue * #51 more on break and continue * #51 more on break and continue * #51 more on break and continue * #51 more on break and continue * break & continue scopes are made lazily, and merged into as discovered Drop ContBreak. Drop ScopeNode.addScope. Add a simple mergeScopes. Simplify Region.inProgress; drop from child classes, use in Region. Add a ConstantNode.XCONTROL shortcut. * Fix some regressions * Error on dead code after break/continue * A more robust dead-def check * Fix for dead loop-back path * Fix scope shadowing bug with continue/break Turn on LAZY phis by default; fix minor golden test results * Fix a case with both break & continue * #51 more on break and continue * #51 more on break and continue * #51 more on break and continue * #51 fix erroneous push of scope * #51 fix import * #51 update test expected results * #51 Start Chapter8 writeup * #51 Start Chapter8 writeup * #51 _scope needs killing after continue * Add graph evaluator (#56) * #51 wip writeup * #51 wip writeup * #51 wip writeup * #51 wip writeup * #51 wip writeup * #51 update code comments / add assertion * #51 revert assertion * #51 evaluate graph to verify test outcome * #51 add code snippets * #51 add examples * Cleanup README Comment for usefullness of true Loops. Try to distiguish `PhiNode` as the programming construct from `phi` as the mathematically SSA notation. Flow long lines. Remove LAZY flag, set as `true`. Fold up true tests. * minor comment * #51 Check _breakScope is not null when parsing break or continue to detect use outside of loop * #51 in parseComparison we need to move the op= version above the op version, since at this time using <= and >= does not work since they are parsed as > and < with a preceeding = which causes an error * #51 Update main README to link to chapter 8 * Remove useless test * Fix regression for dead infinite loop Add shortcut to fancy IRPrettyPrint --------- Co-authored-by: Cliff Click <cliffc@acm.org> Co-authored-by: XmiliaH <45106915+XmiliaH@users.noreply.github.com>
Diffstat (limited to 'chapter08/src/main/java/com/seaofnodes')
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java5
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java6
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/Node.java11
3 files changed, 21 insertions, 1 deletions
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
index d23fa7c5..5878f340 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -69,6 +69,11 @@ public class AddNode extends Node {
return spline_cmp(lhs,rhs) ? swap12() : phiCon(this,true);
// Now we only see (add add non)
+
+ // Dead data cycle; comes about from dead infinite loops. Do nothing,
+ // the loop will peep as dead after a bit.
+ if( lhs.in(1) == lhs )
+ return null;
// Do we have (x + con1) + con2?
// Replace with (x + (con1+con2) which then fold the constants
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
index 0ed32464..0b84f897 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
@@ -15,6 +15,12 @@ public class LoopNode extends RegionNode {
public String label() { return "Loop"; }
@Override
+ public Type compute() {
+ if( inProgress() ) return Type.CONTROL;
+ return entry()._type;
+ }
+
+ @Override
public Node idealize() {
return inProgress() ? null : super.idealize();
}
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
index bc772fb5..22b6f264 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -1,5 +1,6 @@
package com.seaofnodes.simple.node;
+import com.seaofnodes.simple.IRPrinter;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.type.Type;
@@ -100,6 +101,7 @@ public abstract class Node {
public final String print() {
return _print0(new StringBuilder(), new BitSet()).toString();
}
+
// This is the common print: check for repeats, check for DEAD and print
// "DEAD" else call the per-Node print1.
final StringBuilder _print0(StringBuilder sb, BitSet visited) {
@@ -138,6 +140,10 @@ public abstract class Node {
sb.append("\n");
}
+ public final String p(int depth) {
+ return IRPrinter.prettyPrint(this,depth);
+ }
+
public boolean isMultiHead() { return false; }
public boolean isMultiTail() { return false; }
@@ -441,7 +447,10 @@ public abstract class Node {
* Used to allow repeating tests in the same JVM. This just resets the
* Node unique id generator, and is done as part of making a new Parser.
*/
- public static void reset() { UNIQUE_ID = 1; _disablePeephole=false; }
+ public static void reset() {
+ UNIQUE_ID = 1;
+ _disablePeephole=false;
+ }
/**
* Debugging utility to find a Node by index