summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/IterPeeps.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-06-13 15:42:08 -0700
committerCliff Click <cliffc@acm.org>2026-10-24 15:56:44 -0700
commit89dd0a79da85b2c7102b7c8918a1466e6238fe94 (patch)
treecfa3d1457e9c40ad79ae78ded15c7c2ff286d79d /src/main/java/com/seaofnodes/simple/IterPeeps.java
parent8309071562b63f77a15425ab2146e05dbcb5acfd (diff)
downloadSimple-linear-chapter24a.tar.gz
Simple-linear-chapter24a.zip
Chapter 24a: SCCP Within a Functionlinear-chapter24a
Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> Co-authored-by: Hsiang-Ying Fu <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: fuhsnn <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: Symious <14933944+symious@users.noreply.github.com> Co-authored-by: Jun Kawasaki <jun784@gmail.com> Co-authored-by: Hadházy Tamás <helsgithub15@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/IterPeeps.java')
-rw-r--r--src/main/java/com/seaofnodes/simple/IterPeeps.java36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/main/java/com/seaofnodes/simple/IterPeeps.java b/src/main/java/com/seaofnodes/simple/IterPeeps.java
index c4b96c5c..a3b66e09 100644
--- a/src/main/java/com/seaofnodes/simple/IterPeeps.java
+++ b/src/main/java/com/seaofnodes/simple/IterPeeps.java
@@ -1,6 +1,8 @@
package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
+import com.seaofnodes.simple.type.Type;
+import com.seaofnodes.simple.type.TypeInteger;
import com.seaofnodes.simple.util.Ary;
import com.seaofnodes.simple.node.*;
import java.util.Arrays;
@@ -45,7 +47,7 @@ import java.util.Random;
*/
public class IterPeeps {
- private final WorkList<Node> _work;
+ public final WorkList<Node> _work;
private final WorkList<CallEndNode> _workInline;
@@ -74,7 +76,7 @@ public class IterPeeps {
// Only try growing inlines once the shrinking peepholes reach a fixed point.
private void iteratePeeps( CodeGen code ) {
- assert progressOnList(code);
+ assert progressOnList(code, _work, true);
int cnt=0;
Node n;
@@ -109,7 +111,7 @@ public class IterPeeps {
}
// If there are distant neighbors, move to worklist
n.moveDepsToWorklist();
- assert progressOnList(code); // Very expensive assert
+ assert progressOnList(code, _work, true); // Very expensive assert
}
if( n.isUnused() && !(n instanceof StopNode) )
n.kill(); // Just plain dead
@@ -130,18 +132,24 @@ public class IterPeeps {
// neighbors and these should fail, but will then try to add dependencies
// {@link #Node.addDep} which is a side effect in an assert. The {@link
// #midAssert} is used to stop this side effect.
- private boolean progressOnList(CodeGen code) {
+ // Pessimistic solver assert
+ public static boolean progressOnList(CodeGen code, WorkList<Node> list, boolean dir ) {
code._midAssert = true;
Node changed = code._stop.walk( n -> {
- Node m = n;
- if( n.compute().isa(n._type) && (!n.iskeep() || n._nid<=6) ) { // Types must be forwards, even if on worklist
- if( _work.on(n) ) return null;
- m = n.peepholeOpt();
- if( m==null ) return null;
- }
- System.err.println("BREAK HERE FOR BUG");
- return m;
- });
+ Node m = n;
+ Type nval = n.compute();
+ if( (!n.iskeep() || n._nid<=8) && // Types must be forwards, even if on worklist
+ ( dir
+ ? nval.isa(n._type) // Pesi: new value lifts over old
+ : n._type.isa(nval) // Opto: new value falls over old
+ ) ) {
+ if( list.on(n) ) return null;
+ m = n.peepholeOpt();
+ if( m==null ) return null;
+ }
+ System.err.println("BREAK HERE FOR BUG");
+ return m;
+ });
code._midAssert = false;
return changed==null;
}
@@ -197,7 +205,7 @@ public class IterPeeps {
/**
* True if Node is on the WorkList
*/
- boolean on( E x ) { return _on.get(x._nid); }
+ public boolean on( E x ) { return _on.get(x._nid); }
boolean isEmpty() { return _len==0; }
/**