summaryrefslogtreecommitdiff
path: root/chapter20/src/test/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-05 15:38:06 -0700
committerCliff Click <cliffc@acm.org>2026-10-05 15:38:06 -0700
commit81b654d76444d747fdf1d053760e507b50f26e18 (patch)
tree594fa806fc31d848f172d0413de0e431fde6e22a /chapter20/src/test/java/com/seaofnodes
parent3b8ad2977ef3911aed7c681037e4640dca59749b (diff)
downloadSimple-81b654d76444d747fdf1d053760e507b50f26e18.tar.gz
Simple-81b654d76444d747fdf1d053760e507b50f26e18.zip
Small peep to drop simple store-updates out of loops
Diffstat (limited to 'chapter20/src/test/java/com/seaofnodes')
-rw-r--r--chapter20/src/test/java/com/seaofnodes/simple/Chapter11Test.java5
-rw-r--r--chapter20/src/test/java/com/seaofnodes/simple/Chapter19Test.java14
2 files changed, 14 insertions, 5 deletions
diff --git a/chapter20/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter20/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index a38e93c1..439333ca 100644
--- a/chapter20/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter20/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -36,7 +36,8 @@ public class Chapter11Test {
var stop = code._stop;
int[] phis = {0};
stop.walk(n -> {
- if (n instanceof MemPhiNode) phis[0]++;
+ // Store sinking can replace field memory Phis with value Phis.
+ if (n instanceof PhiNode) phis[0]++;
if (n instanceof MemMergeNode m && m.in(1) instanceof BulkMemPhiNode b)
for(int a=b._aliases.nextSetBit(0); a>=0; a=b._aliases.nextSetBit(a+1))
assertTrue(a<m.nIns() && m.in(a)!=null);
@@ -44,7 +45,7 @@ public class Chapter11Test {
!(n instanceof MemPhiNode) && !(n instanceof BulkMemPhiNode) && !(n instanceof ParmNode));
return null;
});
- assertTrue(phis[0]>=3);
+ assertTrue(phis[0]>=4); // Three fields and the loop counter.
assertEquals("S{x=1,y=2,z=3}",Eval2.eval(code,4));
}
diff --git a/chapter20/src/test/java/com/seaofnodes/simple/Chapter19Test.java b/chapter20/src/test/java/com/seaofnodes/simple/Chapter19Test.java
index f7329e63..3cc7d5ab 100644
--- a/chapter20/src/test/java/com/seaofnodes/simple/Chapter19Test.java
+++ b/chapter20/src/test/java/com/seaofnodes/simple/Chapter19Test.java
@@ -452,13 +452,21 @@ return sq(arg) + sq(3);
private static java.util.ArrayList<String> memoryPhis(Node stop) {
var phis = new java.util.ArrayList<String>();
- stop.walk(n -> {
+ // Count only definitions reachable from Stop, as instruction selection does.
+ // A dead Phi cycle can still appear through the reverse use edges.
+ var seen = new java.util.BitSet();
+ var work = new java.util.ArrayList<Node>();
+ work.add(stop);
+ for( int i=0; i<work.size(); i++ ) {
+ Node n = work.get(i);
+ if( n==null || seen.get(n._nid) ) continue;
+ seen.set(n._nid);
+ for( Node def : n._inputs ) work.add(def);
if( n instanceof MemPhiNode phi ) phis.add("alias:"+phi._alias);
if( n instanceof BulkMemPhiNode phi ) phis.add("bulk:"+phi._aliases);
assertFalse(n instanceof PhiNode && n.isMem() &&
!(n instanceof MemPhiNode) && !(n instanceof BulkMemPhiNode) && !(n instanceof ParmNode));
- return null;
- });
+ }
java.util.Collections.sort(phis);
return phis;
}