diff options
| author | Dibyendu Majumdar <dibyendumajumdar@users.noreply.github.com> | 2024-01-15 17:26:29 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-15 09:26:29 -0800 |
| commit | ab8b1f298dcef84026f6b8e04576111126e8c68a (patch) | |
| tree | 37b55161f316b8f6cf5f91af985a18f086a8cc8c /chapter08 | |
| parent | 8a61361eae582669d163e1cdd032a314a012a365 (diff) | |
| download | Simple-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')
4 files changed, 28 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 diff --git a/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java b/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java index 16f7e324..057742c5 100644 --- a/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java +++ b/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java @@ -139,6 +139,13 @@ return arg; } @Test + public void testChapter8Regress2() { + Parser parser = new Parser("if(1) return 0; else while(arg>--arg) arg=arg+1; return 0;"); + StopNode stop = parser.parse(true); + assertEquals("Stop[ return 0; return 0; ]", stop.toString()); + } + + @Test public void testChapter8BreakOutsideLoop() { try { new Parser(""" |
